使用 INNER JOIN 从 2 个表中删除

Delete from 2 tables using INNER JOIN

我有 3 个 table。

发票 table 有外键约束。 发票中的每个条目 table 在 Invoiceoriginal 中都有对应的条目。

invoiceOriginal table 存储发票的原始值,invoice table 存储已被用户修改的值。 这样做是为了在提交时获得差异。

我用的SQL是

DELETE i
FROM invoice i
INNER JOIN InvoiceHistory aih
   ON i.ClientId = aih.HistoryClientNumber
   AND i.invoiceNumber = HistoryInvoiceNumber

但是由于外键约束,无法删除。

table如下:

Invoice         InvoiceOriginal         InvoiceHistory
 Id                FK_InvoiceId            ClientId
 ClientId          ClientId                InvoiceNumber
 InvoiceNumber

一旦 InvoiceHistory 中有相同 clientId 的发票编号条目,我需要删除 invoice 和 InvoiceOriginal 中的条目。

您不能同时对多个 table 发出删除语句,在删除父记录之前,您需要为每个相关的 table 分别执行删除语句

我很确定您不能使用一条语句从多个表中删除。我通常会先用一个语句删除子行,然后再删除父记录。如果您可能需要在失败时回滚,您可能希望在事务内执行此操作。

或者,您可以在外键上启用 CASCADE ON DELETE,这将自动通过子记录级联删除,如果这适合该系统的话。

您不能通过单个查询从多个 table 中删除记录。但是你有两种方法可以解决这个问题

  1. 从子或映射中删除所有相关记录table,然后 删除 Parent / header table 记录。 (此处需要多次查询。使用SQL Transaction更好控制)。

  2. 或者,修改你的外键约束为ON DELETE CASCADE

是的,你可以,我现在就做了:

DELETE T1,T2 FROM T1
        INNER JOIN
    T2 ON T2.FIELD = T1.FIELD
WHERE
    T1.SOMETHING='SOMETHING'