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

SKI*_*DER 20 sql database sql-server-2005 unique-constraint non-clustered-index

我有一个表'users','login'列定义为:

[login] VARCHAR(50) UNIQUE NOT NULL
Run Code Online (Sandbox Code Playgroud)

现在我想使用SQL脚本删除这个唯一的约束/索引.我在我的本地数据库中找到了它的名字UQ_ users _7D78A4E7,但我想它在另一个数据库上有一个不同的名字.

放弃这种独特约束的最佳方法是什么?或至少任何......

谢谢.

Ava*_*esh 32

ALTER TABLE users
DROP CONSTRAINT 'constraints_name'
Run Code Online (Sandbox Code Playgroud)

  • ))是的,'constraints_name'......但是这个约束名称是什么?! (10认同)
  • 我不得不删除单引号,如:ALTER TABLE [dbo].[Accounts] DROP CONSTRAINT [AccountsCardNumberUnique]但是SO一如既往. (3认同)
  • 约束名称是随机的.如果您想要修复它,您需要在创建时为其指定一个名称.`CREATE TABLE用户(登录varchar(50)约束uq_users_login UNIQUE)` (2认同)

小智 22

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 c.name=@col_name

print @Command

--execute (@Command)
Run Code Online (Sandbox Code Playgroud)

  • 如果列上有多个唯一约束,这将被破坏。唯一约束可以跨越多个列,并且一列可能属于多个唯一约束的一部分。 (2认同)

flu*_*uid 7

这主要起作用.

drop index IX_dbo_YourTableName__YourColumnName on dbo.YourTableName
GO
Run Code Online (Sandbox Code Playgroud)


小智 6

要删除UNIQUE约束,您不需要约束的名称,只需要包含在约束中的列的列表.

语法是:

ALTER TABLE table_name DROP UNIQUE (column1, column2, . . . )
Run Code Online (Sandbox Code Playgroud)

  • 问题是标记为SQL-Server而不是MySQL. (6认同)