我有歌手、专辑和单曲三张表,关系如下:
如果删除歌手,专辑和单曲会被删除;
但,专辑被删除前,单曲会阻止专辑被删除;
现在我删除张三报错了(在 Django ORM 构建的这种关系是可以将张三删除的)
DELETE FROM Artist WHERE id=1; # 无法删除 张三
请问有没有大佬了解 MySQL 里外键的 CASCADE 、RESTRICT 选项有没有优先级?或其它什么机制?
我测试的表结构及数据如下:
CREATE TABLE Artist(# 歌手
id INT PRIMARY KEY,
NAME VARCHAR(10)
)
CREATE TABLE Album(# 专辑
id INT PRIMARY KEY,
artist VARCHAR(10),
artist_id INT,
FOREIGN KEY (artist_id) REFERENCES Artist(id)
ON DELETE CASCADE ON UPDATE CASCADE # 歌手被删除时,他的专辑跟随一起被删除
)
CREATE TABLE Song(# 单曲
id INT PRIMARY KEY,
NAME VARCHAR(10),
artist_id INT,
album_id INT,
FOREIGN KEY (album_id) REFERENCES Album(id)
ON DELETE RESTRICT ON UPDATE RESTRICT,# 专辑被删除前,单曲阻止专辑被删除
FOREIGN KEY (artist_id) REFERENCES Artist(id)
ON DELETE CASCADE ON UPDATE CASCADE# 歌手被删除时,单曲跟随一起被删除
)
INSERT INTO Artist VALUES (1, "张三"), (2, "李四"); # 添加两名歌手:张三、李四
INSERT INTO Album VALUES (1, "光专辑", 1), (2, "夜专辑", 2); # 添加两张专辑:光专辑 属于 张三,夜专辑 属于 李四
INSERT INTO Song VALUES (1, "太阳", 1, 1), (2, "月亮", 1, 2); # 添加两首单曲:太阳 属于 张三的光专辑,月亮 属于 夜专辑(但不属于李四的单曲,而是属于张三的单曲)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.