SQL DROP TABLE 外键约束
如果我想像这样删除数据库中的所有表,它会处理外键约束吗?如果没有,我该如何处理?
GO
IF OBJECT_ID('dbo.[Course]','U') IS NOT NULL
DROP TABLE dbo.[Course]
GO
IF OBJECT_ID('dbo.[Student]','U') IS NOT NULL
DROP TABLE dbo.[Student]
If I want to delete all the tables in my database like this, will it take care of the foreign key constraint? If not, how do I take care of that first?
GO
IF OBJECT_ID('dbo.[Course]','U') IS NOT NULL
DROP TABLE dbo.[Course]
GO
IF OBJECT_ID('dbo.[Student]','U') IS NOT NULL
DROP TABLE dbo.[Student]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(17)
不,如果确实有外键引用它,这不会删除您的表。
要获取引用您的表的所有外键关系,您可以使用此 SQL(如果您使用的是 SQL Server 2005 及更高版本):
如果有任何外键关系,则使用此处的此语句,您可以创建 SQL 语句来实际删除这些 FK 关系:
No, this will not drop your table if there are indeed foreign keys referencing it.
To get all foreign key relationships referencing your table, you could use this SQL (if you're on SQL Server 2005 and up):
and if there are any, with this statement here, you could create SQL statements to actually drop those FK relations:
在 SQL Server Management Studio 2008 (R2) 及更高版本中,您可以右键单击
选择要删除的表。
选择“保存到新查询窗口”。
单击“高级”按钮。
将脚本 DROP 和 CREATE 设置为脚本 DROP。
将脚本外键设置为 True。
单击“确定”。
点击下一步->下一步->完成。
查看脚本,然后执行。
In SQL Server Management Studio 2008 (R2) and newer, you can Right Click on the
Select the tables you want to DROP.
Select "Save to new query window".
Click on the Advanced button.
Set Script DROP and CREATE to Script DROP.
Set Script Foreign Keys to True.
Click OK.
Click Next -> Next -> Finish.
View the script and then Execute.
如果您首先删除“子”表,则外键也将被删除。如果您尝试先删除“父”表,您将收到“无法删除对象 'a',因为它被外键约束引用”。错误。
If you drop the "child" table first, the foreign key will be dropped as well. If you attempt to drop the "parent" table first, you will get an "Could not drop object 'a' because it is referenced by a FOREIGN KEY constraint." error.
这是使用
sp_MSdropconstraints
过程正确删除所有表的另一种方法。我能想到的最短的代码:Here is another way to drop all tables correctly, using
sp_MSdropconstraints
procedure. The shortest code I could think of:@mark_s 发布的稍微通用的版本,这帮助我
插入你的表名称,并执行它的结果。
Slightly more generic version of what @mark_s posted, this helped me
just plug your table name, and execute the result of it.
一切都简单多了。有一个配置可以关闭检查并打开它。
例如,如果您使用的是 MySQL,那么要关闭它,必须编写
SETforeign_key_checks = 0;
然后删除或清除该表,并重新启用检查
SETforeign_key_checks = 1 ;
everything is much simpler. There is a configuration to turn off the check and turn it on.
For example, if you are using MySQL, then to turn it off, you must write
SET foreign_key_checks = 0;
Then delete or clear the table, and re-enable the check
SET foreign_key_checks = 1;
如果是 SQL Server,则必须先删除约束,然后才能删除表。
If it is SQL Server you must drop the constraint before you can drop the table.
这是删除表本身后面的所有约束的另一种方法,使用涉及
FOR XML PATH('')
的串联技巧,该技巧允许将多个输入行合并到单个输出行中。应该适用于任何 SQL 2005 和 SQL 2005之后。为了安全起见,我已将 EXECUTE 命令注释掉。
Here's another way to do delete all the constraints followed by the tables themselves, using a concatenation trick involving
FOR XML PATH('')
which allows merging multiple input rows into a single output row. Should work on anything SQL 2005 & later.I've left the EXECUTE commands commented out for safety.
这是实现解决方案的完整脚本:
Here is a complete script to implement a solution:
使用 SQL Server Manager,您可以从 UI 中删除外键约束。如果要删除表
Diary
但 User 表有一个外键DiaryId
指向Diary
表,则可以展开(使用加号)User
表,然后展开Foreign Keys
部分。右键单击指向日记表的外键,然后选择删除
。然后,您可以展开Columns
部分,右键单击并删除DiaryId
列。然后你可以运行:我知道你的实际问题是删除所有表,所以这对于这种情况可能没有用。但是,如果您只想删除一些表,我相信这是有用的(标题没有明确提到删除所有表)。
Using SQL Server Manager you can drop foreign key constraints from the UI. If you want to delete the table
Diary
but the User table has a foreign keyDiaryId
pointing to theDiary
table, you can expand (using the plus symbol) theUser
table and then expand theForeign Keys
section. Right click on the foreign key that points to the diary table then selectDelete
. You can then expand theColumns
section, right click and delete the columnDiaryId
too. Then you can just run:I know your actual question is about deleting all tables, so this may not be a useful for that case. However, if you just want to delete a few tables this is useful I believe (the title does not explicitly mention deleting all tables).
执行以下代码以获取阻止您删除的外键约束名称。例如,我采用
roles
表。您将获得如下所示的 FK 名称:
FK__Table1__roleId__1X1H55C1
现在运行以下代码以删除从上面获得的 FK 引用。
完毕!
execute the below code to get the foreign key constraint name which blocks your drop. For example, I take the
roles
table.you will get the FK name something as below :
FK__Table1__roleId__1X1H55C1
now run the below code to remove the FK reference got from above.
Done!
如果您使用的是 mysql 服务器(不是 MSSQL)并且您不介意丢失表,则可以使用简单的查询一次删除多个表:
这样,在查询中使用表的顺序并不重要。
如果有人要说,如果您有一个包含许多表的数据库,这不是一个好的解决方案:我同意!
If you are on a mysql server (not MSSQL) and if you don't mind loosing your tables, you can use a simple query to delete multiple tables at once:
In this way it doesn't matter in what order you use the table in you query.
If anybody is going to say something about the fact that this is not a good solution if you have a database with many tables: I agree!
找到所有外键。编写它们的脚本
,然后从子表中删除外键。
现在您可以删除父表。
如果您想重新创建父表,请确保运行您之前创建的脚本。
Find all foreign key.. script them
and then delete foreign keys from child table.
now you can drop parent table .
if you want to recreate the parent table make sure to run the script you have created earlier.
此脚本将允许您使用约束名称上的字符串匹配来删除所有外键约束
只需根据需要替换
FK_%
值(请注意,%< /code> 是通配符匹配)
This script will let you delete all Foreign Key Contrainsts using a string match on the Contraint name
Just replace the
FK_<SOME-MATCH-STRING>%
value as needed (and note, the%
is a wildcard match)如果要
DROP
已被其他表使用外键引用的表,请使用DROP TABLE *table_name* CASCADE CONSTRAINTS;
我认为它应该适合你。
If you want to
DROP
a table which has been referenced by other table using the foreign key useDROP TABLE *table_name* CASCADE CONSTRAINTS;
I think it should work for you.
然后删除整个数据库要容易得多:
Then it's a lot easier to drop the entire database: