背景:我需要将给定年份的每个帐户代码的交易记录汇总为一条记录。系统中的所有内容都是由年份驱动的,因此几乎每个主表上都有一个年份 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/