say*_*yth 3 sql-server-2008 foreign-key sql-server constraint metadata
我复制了一个我正在处理的数据库,这样我就可以为我的新版本更改其设计的一些关键元素。
我想从数据库中完全删除一些表,但是由于一些外键约束我不能。
1) 如何查看表中存在的外键约束?
2)如何删除外键和表?
我正在查看 2008R2 的此文档,但我不理解它sys.foreign_keys
以下是为您要删除的所有表生成@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
。)
第一个查询将获取数据库的外键约束,以及拥有的表和引用的表:
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)
警告:删除外键约束后,将破坏两个表之间的参照完整性。仔细做...
归档时间: |
|
查看次数: |
5090 次 |
最近记录: |