您的位置:首页 > 数据库 > MySQL

跟我一起学习MySQL技术内幕(第五版):(第二章学习日记12)

2016-04-28 14:23 621 查看
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,其他保持不变。

on delete 和on update子句还支持其他动作

~1.使用 on delete set null 来代替on delete cascade 这将使innodb把外键列(par_id)设置为null,而不会删除这些行。

~2.使用on update set null,来代替on update cascade 这将使innodb在更新parent表里的行时,把child 表里与之匹配的行的外键列(par_id)设置为null。

~3.child表里的par_id列最初被定义为not null。这无法与 on delete set null和on update set null配合使用,因此必须把该列的定义更改为允许null值。

~4.在最初child表的定义中,par_id列定义为primary key 的一部分。不过主键不允许包含null值。因此,在把par_id改成允许null值的同时还需要把primary key改成unique索引。unique索引要求索引值必须是唯一的(但null值可以措辞出现)

新的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站有毒,我错了)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: