0

我有 3 张桌子,用户、聊天框、图像板。一个用户可以有 (0,N) 个聊天框,一个聊天框可以有 (0,1) 个图像板。我需要删除一个用户。所以我需要在聊天框之前删除图像板,在用户之前删除聊天框。什么要求?!

这是我的架构的图像:

表架构

4

3 回答 3

3

我会使用这样的模式:

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;
于 2012-07-12T16:24:20.300 回答
3

由于您的聊天框引用了图像板,因此您无法删除聊天框,因为到图像板的链接丢失(在所有剩余的图像板中,您不知道哪个属于已删除的聊天框。

但是您不能从 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 中可用。

于 2012-07-12T16:37:09.493 回答
1

向您的和表中添加on delete cascade条件。这样你就不用做任何事情了。如果您删除用户,数据库将为您删除条目。userschatbox

您可以在此处找到 MySQL 的示例

于 2012-07-12T16:22:44.057 回答