【问题标题】:Delete with inner join across 3 tables跨 3 个表使用内部联接删除
【发布时间】:2011-02-18 15:53:46
【问题描述】:

我有三个表,其中一个存储用户基本信息,另一个是个人资料信息,最后一个是存储用户图片。

当我删除这些用户时,我需要删除这些表中的所有数据。所以我写了一个这样的查询。

DELETE Kullanicilar FROM Kullanicilar 
INNER JOIN ProfilBilgileri ON Kullanicilar.ID = ProfilBilgileri.UyeID 
INNER JOIN UyeResim ON Kullanicilar.ID = UyeResim.UyeID 
WHERE Kullanicilar.ID=@ID

但它只是从“Kullanicilar”表中删除数据。
有什么建议吗?

编辑:我使用的是 MSSQL 2008,但托管公司 2000,所以我需要兼容的代码。

【问题讨论】:

  • 有人说使用触发器有风险,所以我没有使用。
  • sql是通用标签,你的意思是sqlsql-server吗?
  • 您可以查看外键上的级联删除。否则,您将需要 3 个不同的 delete 语句(除了在 MySQL 中,我认为您可以在 DELETE 中指定多个表我相信...)
  • 如果使用得当,触发器是没有风险的。任何告诉你这一切的人都只是一个不称职的数据库开发人员。但是它们就像任何其他代码一样,它们可能有错误,而且这些错误可能很严重,因此需要对它们进行广泛的测试。它们是用于许多目的的好工具,但它们是错误的工具。

标签: sql sql-server tsql sql-server-2000


【解决方案1】:

您可以使用 Xavinou 建议的触发器,或者,如果您的表中有外键,您可以使用 Delete on Cascade 选项。您的外键将使用以下方法创建:

FOREIGN KEY ([Id]) REFERENCES AnotherTable
ON DELETE CASCADE

【讨论】:

  • 我没有使用外键,但这是另一种解决方案。
  • 如果您没有外键,那么首先设置它们!
  • 哦,我已经有外键之一了。现在我在另一个上创建了现在我将尝试这段代码。
  • 谢谢谢谢谢谢,你帮我节省了几个小时!
【解决方案2】:

想到的解决方案是使用事务。

BEGIN TRANSACTION

DELETE FROM Kullanicilar WHERE ID = @ID
DELETE FROM ProfilBilgileri WHERE UyeID = @ID
DELETE FROM UyeResim WHERE UyeID = @ID

COMMIT TRANSACTION

【讨论】:

  • 除非你不应该写一个没有 TRY CATCH 块的事务以在其中一个操作失败时回滚。
【解决方案3】:
declare @pbid int
declare @urid int    
SELECT @pbid = ProfilBilgileri.UyeID, @urid = UyeResim.UyeID FROM Kullanicilar INNER JOIN ProfilBilgileri ON Kullanicilar.ID = ProfilBilgileri.UyeID INNER JOIN UyeResim ON Kullanicilar.ID = UyeResim.UyeID WHERE Kullanicilar.ID=@ID

delete Kullanicilar where ID = @ID
delete ProfilBilgileri where UyeID = @pbid
delete UyeResim where UyeID = @urid

当然,我假设 Kullanicilar 和其他两个表之间存在一对一的对应关系。如果是一对多,则需要为其他每个表创建一个临时表,并据此删除。希望这能为您指明正确的方向!

【讨论】:

    猜你喜欢
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2014-01-18
    • 1970-01-01
    相关资源
    最近更新 更多