sql-server - 由于 FK 限制,删除失败

标签 sql-server database transactions sql-server-2014

背景:我需要将给定年份的每个帐户代码的交易记录汇总为一条记录。系统中的所有内容都是由年份驱动的,因此几乎每个主表上都有一个年份 fk。因此,我将给定年份的交易记录选择到临时表中,进行汇总,完成后使用临时表将旧交易从交易表中删除。事务表链接到自身和其他表。

我明白为什么我会收到此错误。如果我有一个表,其中父记录存在于子表中,并且我没有级联删除,则需要先删除子记录。这就是我遇到的问题,这个问题毫无意义,我无法弄清楚为什么或如何发生这种情况。

对于我拉回的数据,我尝试在 SQL 事务中运行以下代码。

--Didn't have this initially and this was causing a problem
UPDATE faTransaction 
SET fkTransactionLink = NULL
WHERE EXISTS(SELECT 1 
             FROM #History h
             WHERE h.pkTransaction = fkTranksactionLink)

--This is where the problem occurs.
DELETE FROM faTransaction 
WHERE EXISTS(SELECT 1
             FROM #History h
             WHERE h.pkTransaction = pkTransaction)

更新运行,但当它点击删除时,它失败并出现以下错误:

The DELETE statement conflicted with the REFERENCE constraint "FK_fiRequisitionDistribution_faTransaction". The conflict occurred in database "Financial_DK", table "dbo.fiRequisitionDistribution", column 'fkTransaction'.

因此,尝试通过运行以下命令来识别 fiRequisitionDistribution 表中存在哪些记录。

SELECT * 
FROM fiRequisitionDistribution rd
WHERE EXISTS(SELECT 1 
              FROM #History h
              WHERE h.pkTransaction = rd.fkTransaction)

这绝对不返回任何记录。

所以我什至更进一步,只是为了确保我没有失去理智,并运行了以下命令:

SELECT *
FROM faTransaction t
INNER JOIN fiRequisitionDistribution rd
      ON t.pkTransaction = rd.fkTransaction
WHERE t.fkYear = 3

果然没有记录返回!!!所以我不确定为什么会出现这个约束错误。任何指导都将非常适用。

最佳答案

这可能不是答案,但因为我无法在评论中格式化代码:

尝试在 EXISTS 子句中显式声明相关性。意思是:

--This is where the problem occurs.
DELETE FROM faTransaction f 
WHERE EXISTS(SELECT 1
             FROM #History h
             WHERE h.pkTransaction = f.pkTransaction)

如果没有这个,您可能会有效地说“WHERE 1=1”。

关于sql-server - 由于 FK 限制,删除失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32187273/

相关文章:

sql - 创建外键 SQL

sql-server - 我应该在存储过程中的临时表上创建主键吗?

oracle - EJB 事务与 Oracle 事务

python - CSV 中列的灵活顺序以及应用程序中项目的硬编码显示

transactions - Hibernate envers 跨多个事务的单个修订

sql-server - 将包括所有表和数据的数据库从 SQL Server 导出到 file.sql 文件的简单方法是什么?

c# - Visual Studio 2013+ 数据库项目 - 部分架构/导入部分数据库项目

c# - 对设置 SQL 查询参数感到困惑

mysql - 使 SQL 查询变得更好的更简单方法