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操作(了解)

相关文章