mysql - 没有从相关表中删除记录 - ON DELETE CASCADE 不起作用
问题描述
这是我的三张桌子
CREATE TABLE IF NOT EXISTS Song (
song_id INT(10) NOT NULL,
song_name VARCHAR(255) NOT NULL,
lyrics TEXT,
genre_id INT(10) NOT NULL,
year_released INT(10),
FOREIGN KEY gfk_id(genre_id)
REFERENCES Genre(genre_id) ON DELETE CASCADE
ON UPDATE CASCADE,
PRIMARY KEY (song_id)
);
CREATE TABLE IF NOT EXISTS Artist (
artist_id VARCHAR(25) NOT NULL,
artist_fname VARCHAR(10),
artist_lname VARCHAR(10),
PRIMARY KEY (artist_id)
);
create table Song_Artist
(
song_id int(10) NOT NULL,
artist_id varchar(25) NOT NULL,
FOREIGN KEY fk_song(song_id)
REFERENCES Song(song_id) ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY fk_artist(artist_id)
REFERENCES Artist(artist_id) ON DELETE CASCADE
ON UPDATE CASCADE
);
Song 和 Artist 表具有多对多关系,我使用交叉引用方法使用名为 Song_Artist 的单独表连接这两个表
我的疑问是,如果我从歌曲表中删除一条记录,是否意味着与已删除歌曲(song_id)相关的相应记录也应该从 Song_Artist 表中删除?或者我应该在 Song_Artist 表中将 Song_id 删除后的值设置为 Null。
我尝试使用此触发器
DELIMITER $$
CREATE TRIGGER song_id_delete BEFORE DELETE ON Song
FOR EACH ROW
BEGIN
DELETE FROM Song_Artist
WHERE song_id = OLD.song_id;
END
DELIMITER ;
MySql 工作台没有显示创建了这个触发器。并且没有显示错误。
解决方案
似乎对我有用;我将genre_ID 的默认值设置为0 并删除了FK 关系,因为我没有流派表。但是您可以看到删除和更新工作。艺术家 1 和歌曲 1 更新为 10,艺术家 5 和歌曲 4 被删除。
我个人认为 Song_artist 应该得到一个复合主键;但你的电话。
是在创建歌曲表之前没有创建流派表的问题吗?因此它不能创建 FK 参考?我怀疑它,因为你说删除不起作用;并不是说您遇到表创建错误...
5.7.12 上的演示 当我无法重新创建错误时,不确定如何调试错误。
CREATE TABLE IF NOT EXISTS Song (
song_id INT(10) NOT NULL,
song_name VARCHAR(255) NOT NULL,
lyrics TEXT,
genre_id INT(10) NOT NULL default 0,
year_released INT(10),
PRIMARY KEY (song_id)
);
CREATE TABLE IF NOT EXISTS Artist (
artist_id VARCHAR(25) NOT NULL,
artist_fname VARCHAR(10),
artist_lname VARCHAR(10),
PRIMARY KEY (artist_id)
);
create table Song_Artist
(
song_id int(10) NOT NULL,
artist_id varchar(25) NOT NULL,
#PRIMARY KEY PK_song_artist (song_ID, artist_id),
FOREIGN KEY FK_Song(song_id)
REFERENCES Song(song_id)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY FK_Artist(artist_id)
REFERENCES Artist(artist_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
推荐阅读
- matlab - 如何对 nifti 图像进行仿射变换?
- react-native - 反应原生 0.53.3 的 Json 解析问题
- html - img 标签中的 srcset 属性
- javascript - 根据第二个数组问题对第一个数组进行排序
- java - 具有 2 个结果集循环的 Servlet
- c# - C# UniqueId 类 XML 反序列化
- python - 如何使用 django-reversion 来保存可能的未来对象?
- context-free-grammar - 具有指定长度/amt 的集合 {a,b} 的上下文无关文法?
- javascript - 如何从来自不同域的 iframe 中访问父 URL?
- javascript - JQuery - 对所有输入进行单一验证,例如(文本、复选框、单选按钮 ...)