11.21
一、外键 级联
外键:create table 表名(字段名 类型(长度),foreign key(外键的字段名称) references 对方表名(对方主键名));
外键的第一种约束
先建主表
再建从表
外键的第二个约束
先插入主表
再插入从表
外键的第三个约束
删除记录时
先删除从表记录
再删主表记录
外键的第四个约束
从表更新外键时 必须保证外键是存在的
外键的第五个约束
更新主表的id时
必须先删除从表关联的数据
或者把关联数据 关联其他的主表id
外键的第六个约束
删除主表时 要先删除从表
级联:
create table emp(
id int primary key auto_increment,
name char(20),
d_id int,
foreign key(d_id) references dept(id)
on delete cascade
on update cascade
);
on delete cascade 当主表删除记录时 从表相关联的记录同步删除
on update cascade 当主表id更新时 从表相关联的记录同步更新
注意是单向的 主表变化是 级联操作从表 从表的变化不会级联到主表
二、多表关联
1.多对一
一个外键 create table 表名(字段名 类型(长度),foreign key(外键的字段名称) references 对方表名(对方主键名));
create table dept(id int primary key auto_increment,name char(20),job char(20));
create table emp(id int primary key auto_increment,name char(20),d_id int,foreign key(d_id) references dept(id));
2.多对多
一个中间表 两个外键
create table teacher(id int primary key auto_increment,name char(15));
create table student(id int primary key auto_increment,name char(15));
#中间表
create table tsr(
id int primary key auto_increment,
t_id int,s_id int,
foreign key(t_id) references teacher(id),
foreign key(s_id) references student(id)
);
3.一对一
一个外键 一个唯一约束
create table customer(c_id int primary key auto_increment,
name char(20),phonenum char(11),addr char(20));
create table student1(s_id int primary key auto_increment,
name char(20),
class char(11),
number char(20),
housenum char(20),c_id int UNIQUE,
foreign key(c_id) references customer(c_id)
);
三、复制表
create table 新的表名 select * from 源表名;
数据
结构
约束不能复制
当条件不成立是 只复制表结构
create table 新的表名 select * from 源表名 where 1 = 2;
四、蠕虫复制
自我复制
insert into 表名称 select *from 表名;
如果有主键 避开主键字段
insert into 表名称(其他字段) select 其他字段 from 表名;