如何解决不知道名称的 DROP 约束
我知道我要提到的内容有很多参考资料。
我更愿意分享一些我认为非常有用的内容,并将其整合到一个地方 - Q&A-style。由于不同时间的不同限制,我早些时候一直在努力寻找这一点。
常用的约束有以下几种:
- 主键约束
- 外键约束
- 独特的约束
- 非空约束
- 默认约束
- 检查约束
ALTER TABLE {table_name} DROP CONSTRAINT {constraint_name};
但是大多数时候我们都是在创建表的时候定义约束并且没有名字。一段时间后,如果我们决定取消任何约束,就不是那么简单了,我们确实需要编写一些相对复杂的查询。
那么,我们如何做到这一点?
解决方法
-- Table T1
IF OBJECT_ID('dbo.T1') IS NOT NULL
DROP TABLE T1
CREATE TABLE T1 (COL1 INT PRIMARY KEY)
-- Table T2
IF OBJECT_ID('dbo.T2') IS NOT NULL
DROP TABLE T2
CREATE TABLE T2 (
COL1 INT FOREIGN KEY REFERENCES T1(COL1),COL2 VARCHAR(2) UNIQUE,COL3 INT NOT NULL DEFAULT(0),CHECK (
COL3 IN (
0,1,2
)
)
)
GO
-- *** Foreign key constraint ***
DECLARE @Table NVARCHAR(256) = N'T2'
DECLARE @Column NVARCHAR(256) = N'COL1'
DECLARE @Command NVARCHAR(1000)
SELECT @Command = 'ALTER TABLE ' + '[' + @Table + '] DROP CONSTRAINT ' + CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @Table
AND COLUMN_NAME = @Column
--PRINT (@Command) -- ALTER TABLE [T2] DROP CONSTRAINT FK__T2__COL1__058EC7FB
EXECUTE (@Command)
GO
-- *** Primary key constraint ***
DECLARE @Table NVARCHAR(256) = N'T1'
DECLARE @Command NVARCHAR(1000)
SELECT @Command = 'ALTER TABLE ' + '[' + @Table + '] DROP CONSTRAINT ' + [name]
FROM sys.key_constraints
WHERE [type] = 'PK'
AND [parent_object_id] = OBJECT_ID(@table);
--PRINT (@Command) -- ALTER TABLE [T1] DROP CONSTRAINT PK__T1__AA1D004EBAE57D94
EXECUTE (@Command)
GO
-- *** Unique key constraint ***
DECLARE @Table NVARCHAR(256) = N'T2'
DECLARE @Column NVARCHAR(256) = N'COL2'
DECLARE @Command NVARCHAR(1000)
SELECT @Command = 'ALTER TABLE [' + @Table + '] DROP CONSTRAINT ' + d.name
FROM sys.tables t
JOIN sys.indexes d ON d.object_id = t.object_id
AND d.type = 2
AND d.is_unique = 1
JOIN sys.index_columns ic ON d.index_id = ic.index_id
AND ic.object_id = t.object_id
JOIN sys.columns c ON ic.column_id = c.column_id
AND c.object_id = t.object_id
WHERE t.name = @Table
AND c.name = @Column
--PRINT (@Command) -- ALTER TABLE [T2] DROP CONSTRAINT UQ__T2__AA1D0040A435D4E0
EXECUTE (@Command)
GO
-- *** Not Null constraint ***
-- ALTER TABLE T2 ALTER COLUMN COL3 INT NULL
-- GO
DECLARE @Table NVARCHAR(256) = N'T2'
DECLARE @Column NVARCHAR(256) = N'COL3'
DECLARE @Command NVARCHAR(1000)
SELECT @Command = 'ALTER TABLE ' + '[' + @Table + '] DROP CONSTRAINT ' + d.name
FROM sys.tables t
JOIN sys.default_constraints d ON d.parent_object_id = t.object_id
JOIN sys.columns c ON c.object_id = t.object_id
AND c.column_id = d.parent_column_id
WHERE t.name = @Table
AND c.name = @Column
--PRINT (@Command) -- ALTER TABLE [T2] DROP CONSTRAINT DF__T2__COL3__0682EC34
EXECUTE (@Command)
GO
-- *** Check constraint ***
DECLARE @Table NVARCHAR(256) = N'T2'
DECLARE @Column NVARCHAR(256) = N'COL3'
DECLARE @Command NVARCHAR(1000)
SELECT @Command = 'ALTER TABLE ' + '[' + @Table + '] DROP CONSTRAINT ' + d.name
FROM sys.tables t
JOIN sys.check_constraints d ON d.parent_object_id = t.object_id
JOIN sys.columns c ON c.object_id = t.object_id
AND c.column_id = d.parent_column_id
WHERE t.name = @Table
AND c.name = @Column
--PRINT (@Command) -- ALTER TABLE [T2] DROP CONSTRAINT CK__T2__COL3__0777106D
EXECUTE (@Command)
一些查询来自我的本地存储库,一些来自不同来源的引用:
Finding a Primary Key Constraint on the fly in SQL Server 2005
Drop Foreign Key without knowing the name of the constraint?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。