四.二.一 将子表的外键属性更新为null,断开数据关系
还是以 部门编号为2的数据进行演示。 开发部下面有岳泽霖和精小妹,员工编号为 3和5.
1 .将员工3和5的 deptId 更新为 null. 然后查询
update u set deptId=null where id=3 or id=5;
2 . 再重新删除 id=2的部门数据。
delete from dept where id=2;
可以正常的删除了。
四.二.二 删除外键关联,断开结构的关系
这个时候,删除 id=1的部门, 还是会报错的,同样是外键关联的错误。
上面断开数据关系,仅仅是断开了 deptId=2的,并没有断开 deptId=1的,所以删除id=1的,同样会报错。
1 . 断开 外键关联。 外键的名称叫做 FK_U_deptId
alter table u drop foreign key FK_U_deptId;
2 . 重新删除 id=1的部门记录
delete from dept where id=1;
其中,很容易明白, 四.二.一 只是针对的某些数据进行删除外键,四.二.二 是针对父表中的所有数据,从结构上断开的。
四.二.三 删除子表数据
无论 deptId 是有值的,还是无值的,都是可以直接删除的。 外键关联,是在删除父表时起作用, 在插入子表和修改子表时起作用。 所以,删除子表,是可以直接删除的。
delete from u where id=3 or id=4;
四.二.四 删除父表时的引用方式
实际上 SQL 有五种方式:
1 . Restrict
2 . No Action
3 . Cascade
4. Set NULL
5. Set Default
MySQL 不支持 set Default , 故只有四种。
其中, Restrict 是默认的方式, 删除和修改时的默认方式。
Restrict : 会检查约束,如果子表中有数据,则不允许删除或者更新。
No Action: 会检查约束,如果子表中有数据,则不允许删除或者更新,与 Restrict 相同。
Cascade: 级联操作。 如果是删除的话,父表可以删除,同时将子表的中数据也删除。 如果是更新的话,父表可以更新,同时将子表 中的外键属性值数据也更新。 (hibernate 常用级别操作)
set null: 父表可以进行删除和更新,同时将 子表中的外键值设置成 null值。
五. Drop, truncate, delete 的区别
删除数据库表中的记录,有三种方式:
1 .drop table 表名
2 . truncate 表名
3 . delete from 表名
三者的侧重点是不一样的,是有很大区别的。 使用者应该根据不同的情况,使用不同的命令执行。
drop 是删除表, 不但会删除表中的数据,而且连表的结构都会删除。
truncate 只会删除表的数据,不会删除表的结构。 是一次性删除数据,相比较于 delete, 效率较高。 会释放空间,自动增长 auto_increment 也会重新开始。
delete 只会删除表的数据,不会删除表的结构。 删除时,是一行一行的删除,相比较于 truncate, 效率低。 不会释放空间, 自动增长 auto_increment 是不会重新开始的。