由于主键约束,我在删除 SQL Server 2008 中的行时遇到问题:
DELETE 语句与 REFERENCE 约束冲突...
有什么办法可以在错误消息中显示冲突的主键?
由于主键约束,我在删除 SQL Server 2008 中的行时遇到问题:
DELETE 语句与 REFERENCE 约束冲突...
有什么办法可以在错误消息中显示冲突的主键?
SQL Server(或竞争产品)中没有内置任何东西可以告诉您哪个特定的表和行导致了冲突。错误消息仅告诉要检查哪个 FK。
根据JLo 给出的答案,您可以为您的表创建自己的 [on before delete] 触发器,该触发器将遍历每个 FK 表并计算相关记录。如果您使用的是 SP,您可以使用 try/catch 块来做同样的事情。
你有我的同情,因为这样的东西写起来会很乏味。如果您要为多个表执行此操作,我建议您使用代码生成器(T4 工具包或 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 的外键约束,则会引发约束错误...这就是正确命名约束很重要的原因,但如果不是,您始终可以运行 J LO 的脚本来找出哪些约束可用。
在更复杂的事情上,比如
delete from tableA where value IN (select top 10 * from tableA)
将您的删除更改为 select * from 并使用类似于上述的 IN 语句交叉引用这些值......您也可以直接运行我的子查询,但这只是一个示例。