约束的级联操作
级联操作是存在于主表(父表)和从表(子表)关系之中,当操作了主表中的数据则要求子表中的数据也随之更新或者删除,这样的操作叫做级联操作,级联操作分为级联删除、级联更新、级联查询(需使用程序去实现)
一、级联删除
在创建数据表的时候必须先创建主表,再创建子表,要把子表的创建放在主表的后面
DEMO:删除主表中的数据
上图不能直接删除数据,因为该数据被子表引用了,如果要删除有两种方案:
1、先删除子表中引用的数据,再删除主表数据
2、使用级联删除
方案一:
方案二:
使用级联删除,就是在删除主表数据的同时删除子表中引用的数据,但是在创建外键的时候要指定使用级联删除的操作。
在从表,自定义约束中增加ON DELETE CASCADE
级联删除就是删除主表中的数据,相应的子表中对应的数据也被删除
二、级联更新
级联就是更新主表中的数据则子表中引用的数据也要随之更新操作叫做级联更新
如果主表中的数据被引用,更新主表的数据会失败,此时有两种解决方案:
1、先更新子表中的数据,再更新主表中的数据(先解除子表对父表数据的引用),先取消子表对主表数据的引用。
2、使用级联更新,在创建外键约束的时候指定级联更新操作
方案一:
方案二:
使用级联更新操作,当主表数据更新了之后对应在子表的数据也随之更新了,但要实现级联操作需要在创建约束的时候使用关键字ON UPDATE CASCADE
指定为级联更新
在oracle中不支持级联更新,mysql可以,如果要在oracle中使用级联更新操作要使用触发器
使用触发器进行级联更新操作
总结:
1、先创建主表在创建子表
2、DROP先删除子表(从表),再删除主表(使用的是DROP)
3、DELETE要先删除子表数据再删除主表数据(可以使用级联删除)
4、先更新子表数据再更新主表数据或者使用级联操作
补充一个问题:要不要使用外键约束的问题?
1、不能使用外键,因为外键约束浪费性能
2、可以使用外键约束,因为约束可以保证数据的完整,而且方便级联操作
3、如果并发非常高,此时最好不要使用外键约束,如果并发量不高,可以使用外键约束