查看外键约束,以便我可以删除表

say*_*yth 3 sql-server-2008 foreign-key sql-server constraint metadata

我复制了一个我正在处理的数据库,这样我就可以为我的新版本更改其设计的一些关键元素。

我想从数据库中完全删除一些表,但是由于一些外键约束我不能。

1) 如何查看表中存在的外键约束?

2)如何删除外键和表?

我正在查看 2008R2 的此文档,但我不理解它sys.foreign_keys

Aar*_*and 9

以下是为您要删除的所有表生成@Shark 显示的脚本的方法。假设您有以下表格:

USE tempdb;
GO

CREATE TABLE dbo.z(z INT PRIMARY KEY); -- we won't delete this one

CREATE TABLE dbo.a
(
 a INT PRIMARY KEY FOREIGN KEY REFERENCES dbo.z(z)
);

CREATE TABLE dbo.b
(
 b INT PRIMARY KEY, 
 a INT FOREIGN KEY REFERENCES dbo.a(a)
);

CREATE TABLE dbo.c
(
 c INT PRIMARY KEY, 
 b INT FOREIGN KEY REFERENCES dbo.b(b), 
 a INT FOREIGN KEY REFERENCES dbo.a(a)
);

-- we won't drop this table either, but we'll need to drop
-- the constraint:

CREATE TABLE dbo.d
(
 d INT, 
 c INT FOREIGN KEY REFERENCES dbo.c(c)
);
Run Code Online (Sandbox Code Playgroud)

但我们只想删除 a、b 和 c。

-- load the tables you want to delete into a table variable:

DECLARE @tables_to_delete TABLE (t NVARCHAR(512));

INSERT @tables_to_delete VALUES('dbo.a'),('dbo.b'),('dbo.c');


DECLARE @sql NVARCHAR(MAX) = N'';

-- build a list of the foreign keys you'll have to drop first:

SELECT @sql += CHAR(13) + CHAR(10) + N'ALTER TABLE ' 
    + QUOTENAME(OBJECT_SCHEMA_NAME(f.parent_object_id))
    + '.' + QUOTENAME(OBJECT_NAME(f.parent_object_id))
    + ' DROP CONSTRAINT ' + QUOTENAME(f.name) + ';'
FROM sys.foreign_keys AS f
INNER JOIN @tables_to_delete AS t
ON f.referenced_object_id = OBJECT_ID(t.t);

-- then the DROP TABLE commands:

SELECT @sql += CHAR(13) + CHAR(10) + N'DROP TABLE '
    + t + ';'
FROM @tables_to_delete;

PRINT @sql;
-- EXEC sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)

结果(如果你运行这个,约束名称看起来会不同):

ALTER TABLE [dbo].[b] DROP CONSTRAINT [FK__b__a__2D27B809];
ALTER TABLE [dbo].[c] DROP CONSTRAINT [FK__c__a__30F848ED];
ALTER TABLE [dbo].[c] DROP CONSTRAINT [FK__c__b__300424B4];
ALTER TABLE [dbo].[d] DROP CONSTRAINT [FK__d__c__32E0915F];
DROP TABLE dbo.a;
DROP TABLE dbo.b;
DROP TABLE dbo.c;
Run Code Online (Sandbox Code Playgroud)

如果您对结果感到满意,请取消注释该EXEC行。

(请注意,PRINT如果脚本非常大,您将无法在使用时完整验证脚本。该脚本被 Management Studio 截断,因为它仍然对将显示的字符数有一个古老的限制。该字符串获胜“T当它被传递给被截断这样sp_executesql。)


Tho*_*ger 8

第一个查询将获取数据库的外键约束,以及拥有的表和引用的表:

select 
    name as FkName,
    object_name(parent_object_id) as ReferencingTable,
    object_name(referenced_object_id) as ReferencedTable
from sys.foreign_keys
Run Code Online (Sandbox Code Playgroud)

如果要删除 FK 约束,可以执行以下操作:

alter table ChildTable
drop FK_ChildTable_RootTable_RootId
go
Run Code Online (Sandbox Code Playgroud)

警告:删除外键约束后,将破坏两个表之间的参照完整性。仔细做...

  • +1 尝试删除单个表时,这显然是最简单的方法。 (2认同)