Loading... #### 干翻外键! --- 有一个名为 `INFORMATION_SCHEMA.TABLE_CONSTRAINTS`存储所有表约束的表。的约束类型 `FOREIGN KEY`也保留在该表中。因此,通过这种类型的过滤,您可以访问所有外键。 ```sql SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' ``` 如果您创建动态查询(for `DROP`-ing 外键)以更改表,则可以达到更改所有表的约束的目的。 ```sql WHILE(EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME IN ('Table1', 'Table2') AND CONSTRAINT_NAME LIKE '%FK__%__DL%')) BEGIN DECLARE @sql_alterTable_fk NVARCHAR(2000) SELECT TOP 1 @sql_alterTable_fk = ('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME IN ('Table1', 'Table2') AND CONSTRAINT_NAME LIKE '%FK__%__DL%' EXEC (@sql_alterTable_fk) END ``` `EXISTS`带有参数的函数确保至少有一个外键约束。 #### 或者BAN掉! 禁用数据库中的所有约束,只需运行以下代码: ```sql -- disable all constraints EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" ``` 要重新打开它们,请运行:(打印当然是可选的,它只是列出表格) ```sql -- enable all constraints exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" ``` 在将数据从一个数据库填充到另一个数据库时,我发现它很有用。这是比放弃约束更好的方法。正如您所提到的,在删除数据库中的所有数据并重新填充它(例如在测试环境中)时,它会派上用场。 最后修改:2022 年 08 月 08 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 喜欢就请我喝一杯奶茶吧~