我维护了一个安装在多个位置的产品,这些产品已经随意升级。在许多表中添加了唯一约束,但我不知道任何特定实例的名称是什么。我所知道的是具有唯一约束的表/列名对,我想编写一个脚本来删除这些列/表组合上的任何唯一约束。
这是SQL Server 2000及更高版本。在2000/2005/2008上运作的东西最好!
答案 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';