外键约束引发错误但已停用
Foreign key constraint raises error but it is deactivated
编辑:我的问题被错误地标记为重复。这是关于 t运行 不可能对表进行约束,而不仅仅是禁用约束,根据 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.
我在这里错过了什么?
谢谢。
为了能够解决这个问题,我按照@Larnu在评论部分指出的做了:
"The correct methodology would be DROP FOREIGN KEY -> TRUNCATE TABLE ->CREATE FOREIGN KEY".
因此,第 1 次删除所有约束:
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.keys,因为 DB 可能不会再被使用了。
编辑:我的问题被错误地标记为重复。这是关于 t运行 不可能对表进行约束,而不仅仅是禁用约束,根据 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.
我在这里错过了什么?
谢谢。
为了能够解决这个问题,我按照@Larnu在评论部分指出的做了:
"The correct methodology would be DROP FOREIGN KEY -> TRUNCATE TABLE ->CREATE FOREIGN KEY".
因此,第 1 次删除所有约束:
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.keys,因为 DB 可能不会再被使用了。