2.13外键和引用完整性
creeate table parent
(
par_id int not null,
primary key (par_id)
) engine = innodb;
create table child ( par_id int not null, chiled_id int not null, primary key (par_id,chile_id) foreign key (par_id) references parent (par_id) on delete cascade on update cascade ) engine =innodb;
这里定义的外键使用
on delete cascade子句指定了:当从parent表里删除某个行时,MySQL也应该从child表里删除与par_id值相匹配的行。
on update cascade子句表示的是,如果更改了parent某个表里的行的par_id值,那么MySQL将自动把child表里所有匹配到的par_id值也更改为这个新行。
下面将进行一系列操作表现这些关系
insert into parent (par_id) values (1),(2),(3);
insert into child (par_id,child_id) values (1,1),(1,2);
insert into child (par_id,chiid_id) values (2,1),(2,2),(2,3);
insert into child (par_id,child_id) values (3,1)
这些语句 会在parent表中添加三行 parent_id 1 2 3
child表里的每个par_id值部分分别与parent表里的某个par_id值相匹配
child表:
par_id child_id
1 1
1 2
2 1
2 2
2 3
3 1
1.innodb引擎在插入新记录时会遵从外键关系的约束,我们在往child表插入值时,如
果它的par_id值并没有parent表里的匹配
insert into child (par_id,child_id) values (4,1);
将会如下报错
error 1452 (23000):Cannot add or update a child row :..............
2.当然级联删除的效果也可以试验,从parent表里删除一行
delete from parent where par_id = 1;
parent表里会删除值为一的那一行,同时也会删除child表里所有par_id 值为一的行
3.级联更新
update parent set par_id = 100 where par_id = 2;
这条命令会把表parent等于2 的那一行 值改为100 同时对应的 child表中原来值为2的parent_id列全部改为parent_id改为100,其他保持不变。
新的child表
create table child ( par_id int null, child_id int not null, unique (par_id,chidld_id), foreign key (par_id) references parent (par_id) on delete set null on update set null )engine = innodb;
这样创建的表即表现上述四点,在 增 删 查 操作时 ,会与先前的创建表表现出不同的特性。。
(忍住眼泪,我不爱玩游戏,尤其是考技术的游戏,但是昨天跟舍友看一个大神玩游戏看上瘾了,b站有毒,我错了)