我有 3 张桌子,用户、聊天框、图像板。一个用户可以有 (0,N) 个聊天框,一个聊天框可以有 (0,1) 个图像板。我需要删除一个用户。所以我需要在聊天框之前删除图像板,在用户之前删除聊天框。什么要求?!
这是我的架构的图像:
我有 3 张桌子,用户、聊天框、图像板。一个用户可以有 (0,N) 个聊天框,一个聊天框可以有 (0,1) 个图像板。我需要删除一个用户。所以我需要在聊天框之前删除图像板,在用户之前删除聊天框。什么要求?!
这是我的架构的图像:
我会使用这样的模式:
BEGIN TRANSACTION
BEGIN TRY
-- delete statements here.
END TRY
COMMIT TRANSACTION;
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCH
删除语句看起来像这样:(我不怎么做 mysql,所以请原谅小错误)
CREATE TEMPORARY TABLE IMAGELIST (
-> ID INT NOT NULL
)
SELECT C.FK_IMAGEBOARD AS ID
FROM CHATBOX C
INTO IMAGELIST
WHERE C.FK_USERNAME = @USERNAME
DELETE FROM CHATBOX WHERE FK_USERNAME = @USERNAME;
DELETE FROM IMAGEBOARD WHERE ID IN
(SELECT ID FROM IMAGELIST)
DELETE FROM USERS WHERE USERNAME = @USERNAME;
由于您的聊天框引用了图像板,因此您无法删除聊天框,因为到图像板的链接丢失(在所有剩余的图像板中,您不知道哪个属于已删除的聊天框。
但是您不能从 imageboard 表中删除,因为它是从 chatbox 表中引用的。如果 imagebox 表包含对 chatbox 表的引用,事情会更容易。
如果任何不再使用的图像板也可以删除,那么以下应该可以工作:
delete from chatbox
where fk_username = 'foobar';
delete from imageboard
where not exists (select 1 from chatbox where imageboard.id = chatbox.fk_imagebox);
delete from users
where username = 'foobar';
commit;
另一种选择是使外键延迟,然后您可以在从聊天框表中删除之前从图像板表中删除,因为延迟约束是在提交时评估的,而不是在运行实际删除语句时。延迟约束在 PostgreSQL 和 Oracle 中可用。
向您的和表中添加on delete cascade
条件。这样你就不用做任何事情了。如果您删除用户,数据库将为您删除条目。users
chatbox
您可以在此处找到 MySQL 的示例