表删除后留下的外键?

时间:2013-04-19 19:55:46

标签: sql ssms

所以这里有一个有趣的...我正在努力复制一个完整的数据库(db1)并从一个数据库到另一个(db2)进行结构化,在此之前我决定尝试删除db2中的所有表。我做了通常的sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAING ALL',然后是sp_msforeachtable 'DROP TABLE ?',令我沮丧的是,它删除了所有6个表的保存。这些表似乎仍然有外键引用。我做了一个搜索,发现这个SQL DROP TABLE foreign key constraint向我展示了如何找到然后尝试删除那些外键引用。

这是有趣的部分:在尝试使用该信息删除它们时,我被告知ssms找不到该对象,因为它不存在或者我没有权限。外键引用来自我之前删除的表。

怎么可能?我到底如何从这里进步?

1 个答案:

答案 0 :(得分:0)

我在“尝试删除它们时”中不知道他们的含义。如果您尝试从系统表中删除外键,那肯定是一个错误。

我猜你现在可以放弃最后6张桌子。

假设我们有两个表A和B

create table A (a int) 
create table B(b int, foreign key (b) references (A.a))

我们试图删除表格。 drop table A将失败,因为B使用声明的外键引用它。但是我们可以自由drop table B,因为A并不关心它是否不再被引用。

因此,在第一次传递后,一个DROP失败,一个成功,留下一个表,现在没有FK引用。再试一次,瞧!,drop table A现在有效。