由于 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 子句可能会得到与预期不同的结果。
背景:我需要将 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 子句可能会得到与预期不同的结果。