我有3张桌子。
发票表具有外键约束。 发票表中的每个条目在Invoiceoriginal中都有相应的条目。
invoiceOriginal表存储发票的原始值,发票表存储用户已修改的值。 这样做是为了在提交时得到不同之处。
我正在使用的SQL是
DELETE i
FROM invoice i
INNER JOIN InvoiceHistory aih
ON i.ClientId = aih.HistoryClientNumber
AND i.invoiceNumber = HistoryInvoiceNumber
但是由于外键约束而无法删除。
表格如下:
Invoice InvoiceOriginal InvoiceHistory
Id FK_InvoiceId ClientId
ClientId ClientId InvoiceNumber
InvoiceNumber
一旦在同一clientId的InvoiceHistory中有该发票编号的条目,我需要删除发票和InvoiceOriginal中的条目。
答案 0 :(得分:6)
您不能一次针对多个表发出删除语句,在删除父记录之前,您需要为每个相关表创建单独的删除语句
答案 1 :(得分:3)
我很确定你不能用一个语句从多个表中删除。我通常会先用一个语句删除子行,然后删除父记录。如果您可能需要在失败时回滚,您可能希望在事务内执行此操作。
或者,您可以在外键上启用CASCADE ON DELETE,如果这是适合此系统的内容,则会通过子记录自动级联删除。
答案 2 :(得分:1)
您无法从单个查询中删除多个表中的记录。但是你有两种方法可以解决这个问题
从子表或映射表中删除所有相关记录,然后 删除父/标头表记录。 (此处需要多个查询。使用SQL Transaction进行更好的控制)。
或者,将您的外键约束修改为ON DELETE CASCADE
答案 3 :(得分:-1)
是的,您可以,我现在做到了:
DELETE T1,T2 FROM T1
INNER JOIN
T2 ON T2.FIELD = T1.FIELD
WHERE
T1.SOMETHING='SOMETHING'