簡體   English   中英

如何從與外鍵連接的表中刪除行?

[英]How can I delete rows from table connected with foreign key?

我有帶有列(ID_Song、Title、ID_Artist、ID_Image、ID_Audio)的表格歌曲,其中 ID_Artist、ID_Image、ID_Audio 是外鍵。

帶有列的表藝術家(ID_Artist,名稱)帶有列的表圖像(ID_Image,文件名,擴展名,大小)帶有列(ID_Audio,文件名,擴展名,大小)的表音頻

列songs.ID_Artist 引用Artists.ID_Artist,songs.ID_Image 引用Images.ID_Image 和songs.ID_Audio 引用Audios.ID_Audio,所以當我從表Songs 中刪除一行時,我希望與其他表中該行相關的數據也被刪除,但我不能因為外鍵,有沒有辦法做到這一點?

表歌

CREATE TABLE `songs` (
 `ID_Song` int(11) NOT NULL AUTO_INCREMENT,
 `SongTitle` varchar(100) NOT NULL,
 `ID_Artist` int(11) NOT NULL,
 `ID_Img` int(11) NOT NULL,
 `ID_SongFile` int(11) NOT NULL,
 `Approved` tinyint(1) NOT NULL DEFAULT 0,
 PRIMARY KEY (`ID_Song`),
 KEY `ID_Artist` (`ID_Artist`),
 KEY `ID_SongFile` (`ID_SongFile`),
 KEY `ID_Img` (`ID_Img`),
 CONSTRAINT `songs_ibfk_1` FOREIGN KEY (`ID_Artist`) REFERENCES `artists` (`ID_Artist`) ON DELETE CASCADE,
 CONSTRAINT `songs_ibfk_2` FOREIGN KEY (`ID_SongFile`) REFERENCES `files` (`ID_File`) ON DELETE CASCADE,
 CONSTRAINT `songs_ibfk_3` FOREIGN KEY (`ID_Img`) REFERENCES `images` (`ID_Img`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1

表格圖片

CREATE TABLE `images` (
 `ID_Img` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(100) NOT NULL,
 `extension` varchar(10) NOT NULL,
 `size` float NOT NULL,
 PRIMARY KEY (`ID_Img`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

對於給定的架構,您需要在刪除歌曲之前獲取ID_SongFileID_Img 假設您要刪除 ID=123 的歌曲。 在純 SQL 中,它可能是:

select ID_SongFile, ID_Img into @file_id, @img_id
from songs
where ID_Song = 123;

delete from songs where ID_Song = 123;

delete from images where ID_Img = @img_id;

delete from files where ID_File = @file_id;

根據您的數據邏輯,“反轉”關系可能會更好。 如果文件和圖像僅與歌曲相關,並且始終是一對一的關系,我會從songs表中刪除ID_SongFileID_Img列,並在imagesfilesID_Song列作為外鍵。 如果你用ON DELETE CASCADE定義那些新的 FK,你只需要刪除這首歌,相關的文件和圖像就會“消失”。

您也可以將所有圖像和文件信息存儲在songs表中。 但恕我直言,列image_nameimage_extensionimage_sizefile_namefile_extensionfile_size看起來不太好。 但這種設計並沒有什么問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM