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

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,其他保持不变。

  1. 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站有毒,我错了)

你可能感兴趣的:(mysql)