当我收到错误时,是否可以显示冲突的主键:DELETE语句与REFERENCE约束冲突

时间:2013-02-19 14:04:24

标签: sql sql-server tsql

由于主键约束,我在删除SQL Server 2008中的行时出现问题:

  

DELETE语句与REFERENCE约束冲突...

我是否有任何方法可以在错误消息中显示冲突的主键?

3 个答案:

答案 0 :(得分:2)

SQL Server(或竞争产品)中没有内置任何内容可以告诉您哪个特定的表和行导致了冲突。错误消息仅告知要检查哪个FK。

基于the answer that JLo gave,您可以为您的表创建自己的[on before before]触发器,这些触发器将沿着每个FK表向下走,并计算相关记录。如果您使用的是SP,则可以使用try / catch块来执行相同的操作。

你有同情心,因为写这样的东西会非常繁琐。如果您为多个表执行此操作,我建议使用代码生成器(T4工具包或MyGeneration)为您生成这些表。

答案 1 :(得分:1)

这将为您提供特定表的外键。你必须自己检查每个配对。

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]')

那应该让你开始......祝你好运!

答案 2 :(得分:0)

它受限制的值是您尝试删除的值之一,所以例如

delete from tableA where value = 123

如果在另一个表中某处有一个外键约束,并且值为123,则会抛出约束错误...这就是为什么正确命名约束很重要,但如果没有,你总是可以运行J LO的脚本来计算哪些限制可用。

更复杂的事情,如

delete from tableA where value IN (select top 10 * from tableA)

将删除更改为select * from并使用类似于上面的IN语句交叉引用这些值...您也可以直接运行我的子查询,但这只是一个示例。