3

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

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

有什么办法可以在错误消息中显示冲突的主键?

4

3 回答 3

2

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

根据JLo 给出的答案,您可以为您的表创建自己的 [on before delete] 触发器,该触发器将遍历每个 FK 表并计算相关记录。如果您使用的是 SP,您可以使用 try/catch 块来做同样的事情。

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

于 2013-02-19T18:45:06.123 回答
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]')

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

于 2013-02-19T14:21:43.200 回答
0

它受到约束的值是您尝试删除的值之一,例如。

delete from tableA where value = 123

如果在另一个表中某处存在值为 123 的外键约束,则会引发约束错误...这就是正确命名约束很重要的原因,但如果不是,您始终可以运行 J LO 的脚本来找出哪些约束可用。

在更复杂的事情上,比如

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

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

于 2013-02-19T18:51:45.580 回答