使用MSSQL2005,如果我首先截断子表(具有FK关系的主键的表),我可以截断带有外键约束的表吗?
我知道我也可以
使用不带where子句的DELETE,然后RESEED标识(或) 删除FK,截断表,并重新创建FK。
我认为只要我在父表之前截断子表,我就可以不做上面的任何一个选项,但我得到了这个错误:
不能截断表'TableName',因为它被一个FOREIGN KEY约束引用。
使用MSSQL2005,如果我首先截断子表(具有FK关系的主键的表),我可以截断带有外键约束的表吗?
我知道我也可以
使用不带where子句的DELETE,然后RESEED标识(或) 删除FK,截断表,并重新创建FK。
我认为只要我在父表之前截断子表,我就可以不做上面的任何一个选项,但我得到了这个错误:
不能截断表'TableName',因为它被一个FOREIGN KEY约束引用。
当前回答
我刚刚发现,只要先禁用子表上的外键约束,就可以在父表上使用TRUNCATE表。 如。
子表上的外键约束child_par_ref引用PARENT_TABLE
ALTER TABLE CHILD_TABLE DISABLE CONSTRAINT child_par_ref;
TRUNCATE TABLE CHILD_TABLE;
TRUNCATE TABLE PARENT_TABLE;
ALTER TABLE CHILD_TABLE ENABLE CONSTRAINT child_par_ref;
其他回答
如果这些答案都不像我的情况那样有效,那就这样做:
减少约束 将所有值设置为允许为空 截断表 添加已删除的约束。
好运!
在使用delete语句删除表中的所有行之后,使用以下命令
delete from tablename
DBCC CHECKIDENT ('tablename', RESEED, 0)
编辑:修正的SQL Server语法
可以在网上其他地方找到
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
-- EXEC sp_MSForEachTable 'DELETE FROM ?' -- Uncomment to execute
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'
好吧,因为我没有找到我使用的非常简单的解决方案的例子,这是:
删除外键; 截断表 重新创建外键
是这样的:
1)查找导致失败的外键名称(例如:FK_PROBLEM_REASON,带字段ID,来自表TABLE_OWNING_CONSTRAINT) 2)从表中删除该键:
ALTER TABLE TABLE_OWNING_CONSTRAINT DROP CONSTRAINT FK_PROBLEM_REASON
3)截断招聘表
TRUNCATE TABLE TABLE_TO_TRUNCATE
4)重新添加第一个表的键:
ALTER TABLE TABLE_OWNING_CONSTRAINT ADD CONSTRAINT FK_PROBLEM_REASON FOREIGN KEY(ID) REFERENCES TABLE_TO_TRUNCATE (ID)
就是这样。
你可以按照这个步骤来做, 通过重新播种表,可以删除表中的数据。
delete from table_name
dbcc checkident('table_name',reseed,0)
如果出现错误,则必须重新播种主表。