如何从表列中删除唯一约束?

问题描述:

我有一个表“用户”与“登录”栏定义为:如何从表列中删除唯一约束?

[login] VARCHAR(50) UNIQUE NOT NULL 

现在我想用SQL脚本删除此唯一约束/索引。我发现它的名字UQ_ 用户 _7D78A4E7在我的本地数据库中,但我想它在另一个数据库上有不同的名称。

什么是放弃这个唯一约束的最好方法是什么?或至少任何...

谢谢。

+4

http://*.com/questions/1430456/how-to-drop-sql-default-constraint-without-knowing-its-name – 2011-03-31 12:11:25

+0

@Mitch小麦:我发现我在sys.indexes表中的唯一约束,但我还没有找到包含此索引的表的任何链接。任何帮助? – SKINDER 2011-03-31 13:01:51

+0

@Mitch小麦:我发现了一个链接到我的表 - 它是object_id,但我找不到必要的列链接... – SKINDER 2011-03-31 13:15:36

SKINDER,你的代码不使用列名。正确的脚本是:

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

set @table_name = N'users' 
set @col_name = N'login' 

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 [email protected]_name 

print @Command 

--execute (@Command) 
+1

如果列上有多个唯一约束条件,则会被破坏。唯一约束可以跨越多个列,并且单个列可以是多个唯一约束的一部分。 – Jim 2014-03-20 15:26:06

ALTER TABLE users 
DROP CONSTRAINT 'constraints_name' 
+5

))是,'constraints_name'...但是什么是这个CONSTRAINT名称? – SKINDER 2011-03-31 13:43:01

+2

约束名称是随机的。如果您希望它被修复,您需要在创建时为其指定一个名称。 CREATE TABLE用户(登录varchar(50)约束uq_users_login UNIQUE)' – 2011-03-31 14:27:44

+0

@Filip De Vos:此表已被创建。现在我无法使用脚本删除此索引。有没有解决办法,除了将数据复制到没有约束的新表中并且删除旧表(这很困难,因为我有外键链接到此表中的另一列)? – SKINDER 2011-03-31 15:04:14

我已经停止对脚本像下面(因为我在这个表中只有一个聚集唯一索引):

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

set @table_name = N'users' 
set @col_name = N'login' 

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 
    where t.name = @table_name and d.type=2 and d.is_unique=1 

--print @Command 

execute (@Command) 

有没有人评论,如果这个解决方案是可以接受的?任何优点和缺点?

谢谢。

+0

如果有效,那么这是一个很好的脚本:)如果这能解决您的问题,请不要费力解决问题。这不像每分钟都会执行一次这样的脚本。 – Tony 2011-04-01 07:38:50

您可以使用下面的脚本:

Declare @Cons_Name NVARCHAR(100) 
Declare @Str NVARCHAR(500) 

SELECT @Cons_Name=name 
FROM sys.objects 
WHERE type='UQ' AND OBJECT_NAME(parent_object_id) = N'TableName'; 

---- Delete the unique constraint. 
SET @Str='ALTER TABLE TableName DROP CONSTRAINT ' + @Cons_Name; 
Exec (@Str) 
GO 

这个作品大多。

drop index IX_dbo_YourTableName__YourColumnName on dbo.YourTableName 
GO 
+0

在SSMS 17中,这是“Drop index Xyz”通过SMO在SQL Server 2016实例上生成的内容。 – 2017-08-16 19:09:53

如需撤销UNIQUE约束,你不需要约束的名字,只是列 列表中包含的约束。

的语法是:

ALTER TABLE table_name DROP UNIQUE (column1, column2, . . .) 
+2

这个问题被标记为SQL-Server而不是MySQL。 – bummi 2014-11-26 20:35:49

使用此SQL命令来删除一个唯一约束:

ALTER TABLE tbl_name 
DROP INDEX column_name 
+0

消息1018,级别15,状态1,行2 “INDEX”附近的语法不正确。如果这是作为表提示的一部分,现在需要WITH关键字和括号。有关正确的语法,请参阅SQL Server联机丛书。 – jlg 2015-12-28 20:37:57

+0

执行数据库查询时出错。 'column_name'不是一个约束。 – 2016-11-30 08:35:58

+0

@PradeepKumarPrabaharan表示'column_name'应该替换为你的列名称 – beginner 2016-12-08 01:17:45

如果你知道你的约束的名字,那么你可以直接使用命令状

alter table users drop constraint constraint_name;

如果你不知道的约束名,您可以使用此命令得到约束

选择constraint_name命令,constraint_type 从在表格名=“您的表名” USER_CONSTRAINTS ;

这种说法对我的作品

ALTER TABLE table_name DROP UNIQUE (column_name); 

展开数据库名称>>扩大到表>>扩大到键>>复制键的名称,然后执行以下命令:

ALTER TABLE Test DROP UQ__test__3213E83EB607700F; 

这里UQ__test__3213E83EB607700F是在测试表上的特定列上创建的唯一键的名称。

我想引用一个前面的问题,因为我面临同样的问题,并由此solution解决。 首先,一个约束总是以其名称中的Hash值构建。所以问题是这个HASH是不同的机器或数据库。例如DF__Companies__IsGlo__6AB17FE4这里6AB17FE4是散列值(8位)。所以,我指的是一个脚本这将是富有成效的所有

DECLARE @Command NVARCHAR(MAX) 
    declare @table_name nvarchar(256) 
    declare @col_name nvarchar(256) 
    set @table_name = N'ProcedureAlerts' 
    set @col_name = N'EmailSent' 

    select @Command ='Alter Table dbo.ProcedureAlerts Drop Constraint [' + (select 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_name 
     and c.name = @col_name) + ']' 

    --print @Command 
    exec sp_executesql @Command 

它会降低你的默认约束。但是,如果你想重新创建它,你可以简单地尝试这个

ALTER TABLE [dbo].[ProcedureAlerts] ADD DEFAULT((0)) FOR [EmailSent] 

最后,只是简单的运行DROP命令删除列。