gpt4 book ai didi

mysql - 如何在单表继承上强制执行参照完整性?

转载 作者:IT老高 更新时间:2023-10-29 00:11:21 27 4
gpt4 key购买 nike

我读过一些 Bill Karwin's关于single table inheritance的答案并认为这种方法对我正在考虑的设置有好处:

Playlist
--------
id AUTO_INCREMENT
title

TeamPlaylist
------------
id REFERENCES Playlist.id
teamId REFERENCES Team.id

UserPlaylist
------------
id REFERENCES Playlist.id
userId REFERENCES User.id

PlaylistVideo
-------------
id
playlistId REFERENCES Playlist.id
videoId REFERENCES Video.id

所有CASCADE选项设置为 DELETE这将在 Playlist 时正常工作但是,如果 User 被删除,会发生什么?或 Team被删除了?

即。如果一个 User被删除,UserPlaylist 中的行将被删除,但 Playlist 中的引用行和 PlaylistVideo会保留。我曾考虑将其作为 TRIGGER AFTER DELETE 执行但无法知道删除请求是否出现,因为 Playlist被删除或如果 User已删除。

在这种情况下实现完整性的最佳方法是什么?

编辑(提供 ERD)

enter image description here

最佳答案

您可以做的是在您的 UsersTeam 表上实现触发器,只要从其中一个中删除行就执行:

用户表:

DELIMITER $$
CREATE TRIGGER user_playlist_delete
BEFORE DELETE ON User FOR EACH ROW
BEGIN
DELETE a FROM Playlist a
INNER JOIN UserPlaylist b ON a.id = b.id AND b.userId = OLD.id;
END$$
DELIMITER ;

团队表:

DELIMITER $$
CREATE TRIGGER team_playlist_delete
BEFORE DELETE ON Team FOR EACH ROW
BEGIN
DELETE a FROM Playlist a
INNER JOIN TeamPlaylist b ON a.id = b.id AND b.teamId = OLD.id;
END$$
DELIMITER ;

这些触发器的作用是每次从这些表中删除一条记录时,DELETE 操作将使用 Playlists 表上自动执行id 即将被删除(通过内部连接)。

我已经测试过了,效果很好。

关于mysql - 如何在单表继承上强制执行参照完整性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11497149/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com