首页 > 解决方案 > 没有从相关表中删除记录 - 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 工作台没有显示创建了这个触发器。并且没有显示错误。

标签: 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
    );

推荐阅读