由于 FK 约束删除失败

Delete Fails Due To FK Constraint

背景:我需要将 t运行saction 记录汇总为给定年份每个帐户代码的一条记录。系统中的所有内容都是由年份驱动的,因此几乎每个大师都有年份 table。所以我正在选择 t运行saction 记录,将给定年份的记录放入临时 table,总结并在完成后使用临时 table 删除旧的 t运行 t运行saction table 中的 sactions。 t运行saction table 链接到自身和其他 tables。

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

对于我撤回的数据,我尝试 运行 在 sql t运行saction.

中添加以下代码
--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)

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

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

因此,通过 运行 执行以下操作来尝试确定 fiRequisitionDistribution table 中存在哪些记录。

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

这个returns绝对没有记录。

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

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"。

先找到问题记录

而不是

DELETE FROM faTransaction 
WHERE EXISTS(SELECT 1
             FROM #History h
             WHERE h.pkTransaction = pkTransaction)

SELECT * FROM faTransaction 
WHERE EXISTS(SELECT 1
             FROM #History h
             WHERE h.pkTransaction = pkTransaction)

这至少应该告诉您它的失败之处。我怀疑您使用此 where exists 子句可能会得到与预期不同的结果。