EDIT :我的问题已被错误地标记为重复。这是关于不能截断表而不仅仅是禁用约束的问题,根据Larnu的说法,这是不可能的,因为我需要删除它们。
我必须清空数据库,然后缩小它。我已经跑了
delete from
在所有表格(exec sp_MSforeachtable 'delete from ?'
)中。
下一步是使用禁用所有约束
alter table tableName nocheck constraint all
(exec 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
即使那样,我仍然会收到错误消息:
Msg 4712, Level 16, State 1, Line 5
Cannot truncate table '...' because it is being referenced by a FOREIGN KEY constraint.
我在这里想念什么?
谢谢。
答案 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.键。