mysql 级联删除 cascade

Posted -脑子坏了-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 级联删除 cascade相关的知识,希望对你有一定的参考价值。

创建表1

mysql> CREATE TABLE C(
    ->
    ->        id TINYINT PRIMARY KEY auto_increment,
    ->        name VARCHAR (20),
    ->        age INT ,
    ->        is_marriged boolean  -- show create table ClassCharger: tinyint(1)
    ->
    -> );

添加表1数据

mysql> INSERT INTO C (name,age,is_marriged) VALUES ("冰冰",12,0),
    ->                                                        ("丹丹",14,0),
    ->                                                        ("歪歪",22,0),
    ->                                                        ("姗姗",20,0),
    ->                                                        ("小雨",21,0);

创建表2  并把子键和主键建立关联并添加级联删除

mysql> CREATE TABLE S3(
    ->        id INT PRIMARY KEY auto_increment,
    ->        name VARCHAR (20),
    ->        charger_id TINYINT,
    ->        FOREIGN KEY (charger_id) REFERENCES C(id) ON DELETE CASCADE       
    -> );

添加表2数据

mysql> INSERT INTO S3(name,charger_id) VALUES ("alvi1",2),
    ->                                             ("alvi2",4),
    ->                                             ("alvi3",5),
    ->                                             ("alvi4",3),
    ->                                             ("alvi5",5),
    ->                                             ("alvi6",3),
    ->                                             ("alvi7",2);

 

 

未删除前数据

mysql> SELECT * from S3;
+----+-------+------------+
| id | name  | charger_id |
+----+-------+------------+
|  1 | alvi1 |          2 |
|  2 | alvi2 |          4 |
|  3 | alvi3 |          5 |
|  4 | alvi4 |          3 |
|  5 | alvi5 |          5 |
|  6 | alvi6 |          3 |
|  7 | alvi7 |          2 |
+----+-------+------------+
mysql> select * from C;
+----+------+------+-------------+
| id | name | age  | is_marriged |
+----+------+------+-------------+
|  1 | 冰冰 |   12 |           0 |
|  2 | 丹丹 |   14 |           0 |
|  3 | 歪歪 |   22 |           0 |
|  4 | 姗姗 |   20 |           0 |
|  5 | 小雨 |   21 |           0 |
+----+------+------+-------------+

 

输入删除语句

mysql> delete from C where id = 4;

 

删除后表数据

mysql> select * from s3;
+----+-------+------------+
| id | name  | charger_id |
+----+-------+------------+
|  1 | alvi1 |          2 |
|  3 | alvi3 |          5 |
|  4 | alvi4 |          3 |
|  5 | alvi5 |          5 |
|  6 | alvi6 |          3 |
|  7 | alvi7 |          2 |
+----+-------+------------+
6 rows in set (0.00 sec)
mysql> select * from C;
+----+------+------+-------------+
| id | name | age  | is_marriged |
+----+------+------+-------------+
|  1 | 冰冰 |   12 |           0 |
|  2 | 丹丹 |   14 |           0 |
|  3 | 歪歪 |   22 |           0 |
|  5 | 小雨 |   21 |           0 |
+----+------+------+-------------+

 

 

 

------set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null
   -- 要注意子表的外键列不能为not null

 先删除之前在s3的外键

mysql> ALTER TABLE s3 DROP FOREIGN KEY s3_ibfk_1;

添加set null方式

mysql> alter table s3 add constraint s3_fk_cc foreign key (charger_id)
    -> references c(id) on delete set null;

查看表记录

mysql> select * from s3;
+----+-------+------------+
| id | name  | charger_id |
+----+-------+------------+
|  1 | alvi1 |          2 |
|  3 | alvi3 |          5 |
|  4 | alvi4 |          3 |
|  5 | alvi5 |          5 |
|  6 | alvi6 |          3 |
|  7 | alvi7 |          2 |
+----+-------+------------+
mysql> select * from C;
+----+------+------+-------------+
| id | name | age  | is_marriged |
+----+------+------+-------------+
|  1 | 冰冰 |   12 |           0 |
|  2 | 丹丹 |   14 |           0 |
|  3 | 歪歪 |   22 |           0 |
|  5 | 小雨 |   21 |           0 |
+----+------+------+-------------+

删除c表jilu

mysql> delete from C where id = 3;

s3表记录变为null

mysql> select * from s3;
+----+-------+------------+
| id | name  | charger_id |
+----+-------+------------+
|  1 | alvi1 |          2 |
|  3 | alvi3 |          5 |
|  4 | alvi4 |       NULL |
|  5 | alvi5 |          5 |
|  6 | alvi6 |       NULL |
|  7 | alvi7 |          2 |
+----+-------+------------+

 

------Restrict方式 :拒绝对父表进行删除更新操作(了解)

------No action方式 在mysql中同Restrict,如果子表中有匹配的记录,则不允许对父表对应候选键
   -- 进行update/delete操作(了解)

以上是关于mysql 级联删除 cascade的主要内容,如果未能解决你的问题,请参考以下文章

element Cascader 级联选择器动态加载实例

MySQL中利用外键实现级联删除更新

级联=“删除” VS orphanRemoval=true VS ondelete="CASCADE

MySQL外键约束,级联删除

关于mysql的级联删除(之前好多人咨询过我)

on_delete=models.CASCADE级联删除