我需要删除一个我不知道名字的唯一约束

时间:2010-06-08 20:39:01

标签: sql sql-server tsql constraints

我维护了一个安装在多个位置的产品,这些产品已经随意升级。在许多表中添加了唯一约束,但我不知道任何特定实例的名称是什么。我所知道的是具有唯一约束的表/列名对,我想编写一个脚本来删除这些列/表组合上的任何唯一约束。

这是SQL Server 2000及更高版本。在2000/2005/2008上运作的东西最好!

3 个答案:

答案 0 :(得分:5)

此脚本将生成ALTER TABLE..... DROP CONSTRAINT....命令列表,然后您可以复制+粘贴并执行(或根据需要执行前调整)以删除所有唯一约束/唯一索引:

SELECT 
    'ALTER TABLE ' + OBJECT_NAME(so.parent_obj) + ' DROP CONSTRAINT ' + so.name
FROM sysobjects so
WHERE so.xtype = 'UQ'

我希望它适用于2000到2008 R2的所有SQL Server版本。

答案 1 :(得分:2)

这比看起来应该更复杂,我找到了一种适合我的方式 - 我相信它只适用于SQL Server 2005或更高版本。这是完整的场景:

使用列上的唯一约束创建表,例如:

CREATE TABLE table_name (
    id bigint identity not null,
    column_name varchar(255) not null,
    primary key(id),
    unique (column_name)
);

稍后,发现不需要这种独特的约束。

INSERT INTO table_name(column_name) VALUES('col1');

导致:违反UNIQUE KEY约束'UQ__table_na__9FA0BA59160F4887'。无法在对象'dbo.table_name'中插入重复键。

如果您手动控制此数据库并且可以直接在其上运行SQL,请执行以下操作:

ALTER TABLE table_name DROP CONSTRAINT UQ__table_na__9FA0BA59160F4887;

在我的情况下,这些脚本将在不同的环境中运行,并且键不具有相同的名称,因此为了删除约束,我需要SQL,它将表和列名称作为输入并计算出其余的

DECLARE @table_name nvarchar(256)
DECLARE @col_name nvarchar(256)
DECLARE @Command  nvarchar(1000)

-- set your table and column name here:
SET @table_name = N'table_name'
SET @col_name = N'column_name'

SELECT @Command = 'ALTER TABLE ' + @table_name + ' 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_name and c.name=@col_name

--if you want to preview the generated command before running
SELECT @Command

EXEC sp_executesql @Command;

删除列上的唯一约束并允许插入继续。

答案 2 :(得分:0)

This page有一个快速而又脏的方法来提取数据库中的所有CONSTRAINT,然后你可以构建动态SQL来删除它们:

SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint,
SCHEMA_NAME(schema_id) AS SchemaName,
OBJECT_NAME(parent_object_id) AS TableName,
type_desc AS ConstraintType
FROM sys.objects
WHERE type_desc LIKE '%CONSTRAINT';