如何从表列中删除唯一约束?
我有一个表“用户”与“登录”栏定义为:如何从表列中删除唯一约束?
[login] VARCHAR(50) UNIQUE NOT NULL
现在我想用SQL脚本删除此唯一约束/索引。我发现它的名字UQ_ 用户 _7D78A4E7在我的本地数据库中,但我想它在另一个数据库上有不同的名称。
什么是放弃这个唯一约束的最好方法是什么?或至少任何...
谢谢。
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)
如果列上有多个唯一约束条件,则会被破坏。唯一约束可以跨越多个列,并且单个列可以是多个唯一约束的一部分。 – Jim 2014-03-20 15:26:06
ALTER TABLE users
DROP CONSTRAINT 'constraints_name'
))是,'constraints_name'...但是什么是这个CONSTRAINT名称? – SKINDER 2011-03-31 13:43:01
约束名称是随机的。如果您希望它被修复,您需要在创建时为其指定一个名称。 CREATE TABLE用户(登录varchar(50)约束uq_users_login UNIQUE)' – 2011-03-31 14:27:44
@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)
有没有人评论,如果这个解决方案是可以接受的?任何优点和缺点?
谢谢。
如果有效,那么这是一个很好的脚本:)如果这能解决您的问题,请不要费力解决问题。这不像每分钟都会执行一次这样的脚本。 – 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
在SSMS 17中,这是“Drop index Xyz”通过SMO在SQL Server 2016实例上生成的内容。 – 2017-08-16 19:09:53
如需撤销UNIQUE约束,你不需要约束的名字,只是列 列表中包含的约束。
的语法是:
ALTER TABLE table_name DROP UNIQUE (column1, column2, . . .)
这个问题被标记为SQL-Server而不是MySQL。 – bummi 2014-11-26 20:35:49
使用此SQL命令来删除一个唯一约束:
ALTER TABLE tbl_name
DROP INDEX column_name
如果你知道你的约束的名字,那么你可以直接使用命令状
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
命令删除列。
http://*.com/questions/1430456/how-to-drop-sql-default-constraint-without-knowing-its-name – 2011-03-31 12:11:25
@Mitch小麦:我发现我在sys.indexes表中的唯一约束,但我还没有找到包含此索引的表的任何链接。任何帮助? – SKINDER 2011-03-31 13:01:51
@Mitch小麦:我发现了一个链接到我的表 - 它是object_id,但我找不到必要的列链接... – SKINDER 2011-03-31 13:15:36