外键约束会引发错误,但会被停用

时间:2018-07-23 11:12:03

标签: sql-server database foreign-keys sql-server-2014

EDIT 我的问题已被错误地标记为重复。这是关于不能截断表而不仅仅是禁用约束的问题,根据Larnu的说法,这是不可能的,因为我需要删除它们。

我必须清空数据库,然后缩小它。我已经跑了

delete from在所有表格(exec sp_MSforeachtable 'delete from ?')中。

下一步是使用禁用所有约束

alter table tableName nocheck constraint allexec sp_MSforeachtable 'alter table ? nocheck constraint all'

并检查它们是否确实被禁用:

select
     [Table]     = o2.name, 
     [Constraint] = o.name, 
     [Enabled]   = case when ((C.Status & 0x4000)) = 0 then 1 else 0 end
from sys.sysconstraints C
     inner join sys.sysobjects o on  o.id = c.constid and o.xtype='F'
     inner join sys.sysobjects o2 on o2.id = o.parent_obj

check disabled constraints

即使那样,我仍然会收到错误消息:

Msg 4712, Level 16, State 1, Line 5
Cannot truncate table '...' because it is being referenced by a FOREIGN KEY constraint.

我在这里想念什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我做了@Larnu在评论部分中指出的事情:

“正确的方法是DROP FOREIGN KEY-> TRUNCATE TABLE-> CREATE FOREIGN KEY”。

因此,首先删除所有约束:

USE DATABASE;

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
ALTER TABLE [DATABASE].' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id))
    + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + 
    ' DROP CONSTRAINT ' + QUOTENAME(name) + ';'
FROM sys.foreign_keys;

EXEC sp_executesql @sql;

然后第二次截断表格:

exec sp_MSforeachtable 'truncate table ?'

由于数据库可能不再使用,因此我没有重新创建F.键。