使用INNER JOIN从2个表中删除数据

16 浏览
0 Comments

使用INNER JOIN从2个表中删除数据

我有三个表格。

  • InvoiceOriginal
  • Invoice
  • InvoiceHistory

Invoice表格有一个外键约束。

Invoice表格中的每个条目都对应于InvoiceOriginal表格中的一个条目。

InvoiceOriginal表格存储了发票的原始值,而Invoice表格存储了用户修改后的值。

这样做是为了在提交时获得差异。

我正在使用的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

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

0
0 Comments

无法同时对多个表执行删除语句,需要在删除父记录之前为每个相关表编写单独的删除语句。

出现原因:

无法直接使用一条删除语句同时删除多个表中的数据。在关系型数据库中,当存在多个表之间的关联关系时,删除父表的记录可能会破坏子表的完整性约束。为了避免这种情况的发生,数据库管理系统不允许直接在一条语句中删除多个表的数据。

解决方法:

必须为每个相关表编写单独的删除语句,先删除子表中的数据,再删除父表中的数据。这样可以保证删除操作不会破坏表之间的关联和完整性约束。

示例代码(SQL):

DELETE FROM child_table WHERE parent_id = 1;
DELETE FROM parent_table WHERE id = 1;

以上代码示例中,首先从子表(child_table)中删除与父表(parent_table)中指定父记录(id = 1)相关的子记录。然后再从父表中删除指定的父记录。

在关系型数据库中,删除涉及到多个表的数据时,无法使用一条删除语句同时删除多个表中的数据。必须为每个相关表编写单独的删除语句,先删除子表中的数据,再删除父表中的数据,以保证数据的完整性和一致性。

0
0 Comments

原因:无法通过单个查询从多个表中删除记录。

解决方法:

1. 从子表或映射表中删除所有相关记录,然后删除父表或头表记录。(这里需要多个查询。使用SQL事务可以更好地控制)。

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

0
0 Comments

在数据库中,使用单个语句无法从多个表中删除数据。一般情况下,我们会先使用一条语句删除子表的记录,然后再删除父表的记录。如果可能需要在失败时回滚操作,你可能希望在事务中执行这些操作。

另外,你还可以在外键上启用CASCADE ON DELETE,如果适用于该系统,这将自动级联删除子表记录。

你能否提供CASCADE ON DELETE的语法?

你可以在外键上进行设置,具体操作可以参考这个链接:msdn.microsoft.com/en-GB/library/ms188066.aspx

0