跟我一起学习MySQL技术内幕(第五版):(第二章学习日记12)
2016-04-28 14:23
621 查看
2.13外键和引用完整性
这里定义的外键使用
on delete cascade子句指定了:当从parent表里删除某个行时,MySQL也应该从child表里删除与par_id值相匹配的行。
on update cascade子句表示的是,如果更改了parent某个表里的行的par_id值,那么MySQL将自动把child表里所有匹配到的par_id值也更改为这个新行。
下面将进行一系列操作表现这些关系
这些语句 会在parent表中添加三行
child表里的每个par_id值部分分别与parent表里的某个par_id值相匹配
child表:
1.innodb引擎在插入新记录时会遵从外键关系的约束,我们在往child表插入值时,如
果它的par_id值并没有parent表里的匹配
将会如下报错
2.当然级联删除的效果也可以试验,从parent表里删除一行
parent表里会删除值为一的那一行,同时也会删除child表里所有par_id 值为一的行
3.级联更新
这条命令会把表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表
这样创建的表即表现上述四点,在 增 删 查 操作时 ,会与先前的创建表表现出不同的特性。。
(忍住眼泪,我不爱玩游戏,尤其是考技术的游戏,但是昨天跟舍友看一个大神玩游戏看上瘾了,b站有毒,我错了)
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站有毒,我错了)
相关文章推荐
- JDBC连接测试
- mysql表类型
- win7下安装MySQL和myODBC
- 修改订单的收货时间(MySQL)脚本
- 查看MySQL数据库各表大小
- mysql避免插入重复记录
- Mysql(四)- 存储引擎和事务,备份和恢复,索引,存储过程
- mysql安装最后一步error nr.1045解决方法
- mysql主从复制(replication)
- 深入Mysql字符集设置[精华结合]
- mysql提示错误#42000You have an error in your SQL syntax; check the manual that corresponds
- mysql慢查询设置
- mysql 中 character set 与 collation 的点滴理解(collation即比对方法,用于对应字符集的数据集如何排序以及字符串的比对规则)
- MySql:charset和collation的设置
- MySQL数据库备份
- mysqldump备份还原数据库(日常记录)
- mysql忘记密码的处理方式(整理非原创)
- Software Quality and Testing in MySQL
- mysql--学生课程成绩表
- windows下安装解压缩mysql