我有,因为主键约束的删除在SQL Server 2008中的行的一个问题:我可以显示冲突的主键,当我得到的错误:DELETE语句冲突与基准约束
The DELETE statement conflicted with the REFERENCE constraint...
有什么办法可以在错误消息中显示冲突的主键?
我有,因为主键约束的删除在SQL Server 2008中的行的一个问题:我可以显示冲突的主键,当我得到的错误:DELETE语句冲突与基准约束
The DELETE statement conflicted with the REFERENCE constraint...
有什么办法可以在错误消息中显示冲突的主键?
SQL服务器(或竞争产品)中没有任何内容会告诉你哪个特定的表和行导致冲突。该错误消息只会告知要检查哪个FK。
根据the answer that JLo gave,你可以在你自己的[在删除之前]触发你的表格,这些表格将沿着每个FK表遍历并计数相关记录。如果你正在使用SP,你可以使用try/catch块来做同样的事情。
你有我的同情心,因为这样的事情写起来会很乏味。如果你为此做了几个表,我建议使用代码生成器(T4 toolkit或MyGeneration)为你生成这些表。
这将为您提供特定表的外键。你必须自己检查每个配对。
SELECT
f.name as [Foreign Key],
OBJECT_NAME(f.parent_object_id) as [Table],
COL_NAME(fc.parent_object_id, fc.parent_column_id) as [Column],
OBJECT_NAME(f.referenced_object_id) as [Reference Table],
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) as [Reference Column]
FROM sys.foreign_keys f
JOIN sys.foreign_key_columns fc
ON fc.constraint_object_id = f.object_id
WHERE fc.parent_object_id = OBJECT_ID(N'[dbo].[Document]')
这应该让你开始......祝你好运!
它受到限制的值是您试图删除的值之一,所以前例。
delete from tableA where value = 123
将抛出一个约束错误,如果有符合的123值的另一个表的外键约束的地方......这就是为什么正确命名你的约束是重要的,但如果没有,你总是可以运行Ĵ LO的脚本来找出哪些约束可用。
在类似
delete from tableA where value IN (select top 10 * from tableA)
更复杂的更改删除成SELECT * FROM和交叉引用使用类似于上述的陈述这些值......你也可以直接运行我的子查询,但它是只是一个例子。
谢谢。我已经有了关系 - 它包含在错误信息中。该查询对于显示关系仍然很有用。 – 2013-02-19 14:30:23
如果它已显示在错误消息中,为什么要问如何显示它?我可能错过了 – 2013-02-19 14:38:39
这个问题的要点,我正在寻找要显示的冲突行的主键。例如 - TableA中的Id 123正被TableB引用。 – 2013-02-19 14:40:46