[英]I have to delete some rows from two tables which are connected with a foreign key on the basis of counts
[英]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_SongFile
和ID_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_SongFile
和ID_Img
列,并在images
和files
表ID_Song
列作为外键。 如果你用ON DELETE CASCADE
定义那些新的 FK,你只需要删除这首歌,相关的文件和图像就会“消失”。
您也可以将所有图像和文件信息存储在songs
表中。 但恕我直言,列image_name
、 image_extension
、 image_size
、 file_name
、 file_extension
和file_size
看起来不太好。 但这种设计并没有什么问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.