MYSQL 外键 ON DELETE 和 ON UPDATE

Posted

技术标签:

【中文标题】MYSQL 外键 ON DELETE 和 ON UPDATE【英文标题】:MYSQL Foreign Key ON DELETE and ON UPDATE 【发布时间】:2015-12-29 10:07:25 【问题描述】:

我有一个网站,其中有一个用户表和一个电影表。我正在创建一个收藏夹表,以便用户可以将电影保存到他们的收藏夹列表中。问题是关于我被建议使用下面的收藏夹表:

CREATE TABLE Favorites (
  user_id INT NOT NULL,
  movie_id INT NOT NULL,
  PRIMARY KEY (user_id, movie_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id),
  FOREIGN KEY (movie_id) REFERENCES Movies(movie_id)
); 

我注意到在阅读外键时有一个“ON DELETE”和“ON UPDATE”选项,您可以在其中设置限制、级联等...

如果用户收藏了许多电影,然后从电影表中删除了其中一部电影,如果将外键设置为“CASCADE”会发生什么?收藏夹表中的任何行也会被删除吗?如果外键设置为“RESTRICT”会怎样?

我只是在做一个基本的解释,因为我目前还没有完全理解这一点。

【问题讨论】:

那么手册就是你的朋友mysql manual 【参考方案1】:

13.1.17.3 Using FOREIGN KEY Constraints

...

CASCADE:删除或更新父表中的行,并自动删除或更新子表中匹配的行。 ON DELETE CASCADEON UPDATE CASCADE 均受支持。在两个表之间,不要定义多个ON UPDATE CASCADE子句作用于父表或子表中的同一列。

注意

目前,级联外键操作不激活触发器。

...

RESTRICT:拒绝父表的删除或更新操作。指定 RESTRICT(或 NO ACTION)与省略 ON DELETEON UPDATE 子句相同。 p>

NO ACTION:标准 SQL 中的关键字。在 MySQL 中,相当于 RESTRICT。 MySQL 服务器拒绝删除或更新操作 父表中是否存在相关的外键值 参考表。一些数据库系统有延迟检查,NO ACTION 是延迟检查。在 MySQL 中,外键约束是 立即检查,因此 NO ACTIONRESTRICT 相同。

...

【讨论】:

以上是关于MYSQL 外键 ON DELETE 和 ON UPDATE的主要内容,如果未能解决你的问题,请参考以下文章

MySQL外键约束On Delete和On Update的使用

跨 3 个表的 MySQL 外键“ON DELETE CASCADE”

Django2.0 models中的on_delete参数

多列外键:将单列设置为 Null “ON DELETE”而不是全部

mysql参照完整性 策略设置之 on update 和 on delete

Django 模型外键 on_delete=null 但外键还是被删除了