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 CASCADE 和 ON UPDATE CASCADE 均受支持。在两个表之间,不要定义多个ON UPDATE CASCADE子句作用于父表或子表中的同一列。
注意
目前,级联外键操作不激活触发器。
...
RESTRICT:拒绝父表的删除或更新操作。指定 RESTRICT(或 NO ACTION)与省略 ON DELETE 或 ON UPDATE 子句相同。 p>
NO ACTION:标准 SQL 中的关键字。在 MySQL 中,相当于 RESTRICT。 MySQL 服务器拒绝删除或更新操作 父表中是否存在相关的外键值 参考表。一些数据库系统有延迟检查,NO ACTION 是延迟检查。在 MySQL 中,外键约束是 立即检查,因此 NO ACTION 与 RESTRICT 相同。
...
【讨论】:
以上是关于MYSQL 外键 ON DELETE 和 ON UPDATE的主要内容,如果未能解决你的问题,请参考以下文章
MySQL外键约束On Delete和On Update的使用
跨 3 个表的 MySQL 外键“ON DELETE CASCADE”
多列外键:将单列设置为 Null “ON DELETE”而不是全部