使用 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 中删除记录。但是你有两种方法可以解决这个问题
从子或映射中删除所有相关记录table,然后
删除 Parent / header table 记录。 (此处需要多次查询。使用SQL Transaction更好控制)。
或者,修改你的外键约束为ON DELETE CASCADE
是的,你可以,我现在就做了:
DELETE T1,T2 FROM T1
INNER JOIN
T2 ON T2.FIELD = T1.FIELD
WHERE
T1.SOMETHING='SOMETHING'
我有 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 中删除记录。但是你有两种方法可以解决这个问题
从子或映射中删除所有相关记录table,然后 删除 Parent / header table 记录。 (此处需要多次查询。使用SQL Transaction更好控制)。
或者,修改你的外键约束为ON DELETE CASCADE
是的,你可以,我现在就做了:
DELETE T1,T2 FROM T1
INNER JOIN
T2 ON T2.FIELD = T1.FIELD
WHERE
T1.SOMETHING='SOMETHING'