这是我的三张 table
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_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 工作台未显示此触发器已创建。并且没有显示任何错误。
最佳答案
似乎对我有用;我将 generic_ID 的默认值设置为 0 并删除了 FK 关系,因为我没有流派表。但您可以看到删除和更新工作正常。艺术家 1 和歌曲 1 更新为 10,艺术家 5 和歌曲 4 被删除。
我个人认为Song_artist应该得到一个复合主键;但你的决定。
问题是您在创建歌曲表之前没有创建流派表吗?因此它无法创建 FK 引用?我对此表示怀疑,因为你说删除不起作用;并不是说您遇到了表创建错误...
demo on 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
);
关于mysql - 记录未从相关表中删除 - ON DELETE CASCADE 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52960415/