如何从表列中删除唯一约束?
Posted
技术标签:
【中文标题】如何从表列中删除唯一约束?【英文标题】:How to drop a unique constraint from table column? 【发布时间】:2011-07-26 20:30:35 【问题描述】:我有一个表“用户”,其中“登录”列定义为:
[login] VARCHAR(50) UNIQUE NOT NULL
现在我想使用 SQL 脚本删除这个唯一的约束/索引。我在我的本地数据库中找到了它的名称 UQ_users_7D78A4E7,但我想它在另一个数据库中具有不同的名称。
删除这个唯一约束的最佳方法是什么?或者至少任何...
谢谢。
【问题讨论】:
***.com/questions/1430456/… @Mitch Wheat:我在 sys.indexes 表中找到了我的唯一约束,但我没有找到任何指向包含该索引的表的链接。有什么帮助吗? @Mitch Wheat:我找到了我的表格的链接 - 它是 object_id,但我找不到必要列的链接... 我认为在完整的 SQL 中是不可能的(但在@Rail 提出的脚本中可以)。最好的方法是将列复制到新列,在新列中设置约束,销毁旧列,然后用旧列名重命名新列。 【参考方案1】:ALTER TABLE users
DROP CONSTRAINT 'constraints_name'
如果没有提供早期的约束名称,它将有一些默认的约束名称,在 pgAdmin 4 (pSql) 中,尝试违反约束,您可以在收到的错误中看到约束名称被违反,很可能与其他的情况相同平台或网络上有一些文章,其中约束名称是从存储它们的某些表中提取的,但对此不确定。 P.S : 也可以参考 cmets
【讨论】:
)) 是的,'constraints_name'...但是这个约束名称是什么?! 约束名称是随机的。如果您希望它被修复,您需要在创建时为其分配一个名称。CREATE TABLE users(login varchar(50) constraint uq_users_login UNIQUE)
@Filip De Vos:此表已创建。现在我无法使用脚本删除此索引。除了将数据复制到没有约束的新表并删除旧表之外,还有其他解决方案吗(这相当困难,因为我有链接到该表中另一列的外键)?
我不得不删除单引号,如下所示:ALTER TABLE [dbo].[Accounts] DROP CONSTRAINT [AccountsCardNumberUnique] 但 SO 还是一如既往。
正如@Mike 所说.. 没有单引号。【参考方案2】:
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)
【讨论】:
如果列上有多个唯一约束,这将被破坏。唯一约束可以跨越多个列,并且单个列可能是多个唯一约束的一部分。 在 sql server 上不起作用,一直说我的约束不是约束 这是为 SQL Server 2017 更新的脚本:pastebin.com/FerWr612【参考方案3】:这很有效。
drop index IX_dbo_YourTableName__YourColumnName on dbo.YourTableName
GO
【讨论】:
在 SSMS 17 中,这是通过 SQL Server 2016 实例上的 SMO 生成的“Drop index Xyz”。【参考方案4】:要删除 UNIQUE 约束,您不需要约束的名称,只需 约束中包含的列的列表。
语法是:
ALTER TABLE table_name DROP UNIQUE (column1, column2, . . . )
【讨论】:
问题标记为 SQL-Server 而不是 mysql。【参考方案5】:您可以使用以下脚本:
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
【讨论】:
【参考方案6】:使用此 SQL 命令删除唯一约束:
ALTER TABLE tbl_name
DROP INDEX column_name
【讨论】:
Msg 1018, Level 15, State 1, Line 2 'INDEX' 附近的语法不正确。如果打算将其作为表提示的一部分,则现在需要 WITH 关键字和括号。有关正确的语法,请参阅 SQL Server 联机丛书。 执行数据库查询时出错。 'column_name' 不是约束。 @PradeepKumarPrabaharancolumn_name
应该替换为您的列名
哈哈@beginner 我不是初学者..不知道为什么会出现错误..我创建了重复的表并更改了它..谢谢..【参考方案7】:
这句话对我有用
ALTER TABLE table_name DROP UNIQUE (column_name);
【讨论】:
语法无效。 这行得通,语法甚至可以在某些数据库之间移植。谢谢!【参考方案8】:我已停止使用如下脚本(因为我在此表中只有 一个 非聚集唯一索引):
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)
如果这个解决方案是可以接受的,有没有人 cmet?有什么优缺点吗?
谢谢。
【讨论】:
如果它有效,那么它是一个很好的脚本:) 如果这已经解决了您的问题,请不要为这个问题而努力。并不是每分钟都会执行这样的脚本。【参考方案9】:扩展为数据库名称>>扩展为表>>扩展为键>>复制键的名称然后执行以下命令:
ALTER TABLE Test DROP UQ__test__3213E83EB607700F;
这里 UQ__test__3213E83EB607700F 是在测试表的特定列上创建的唯一键的名称。
【讨论】:
【参考方案10】:我想参考以前的问题,因为我遇到了同样的问题并通过这个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
命令即可删除该列。
【讨论】:
【参考方案11】:我遇到了同样的问题。我正在使用 DB2。我所做的不是太专业的解决方案,但它适用于每个 DBMS:
-
添加具有相同定义但没有唯一约束的列。
将原始列中的值复制到新列中
删除原始列(这样 DBMS 也会删除约束,无论其名称是什么)
最后将新的重命名为原来的
最后进行重组(仅在 DB2 中)
ALTER TABLE USERS ADD COLUMN LOGIN_OLD VARCHAR(50) NOT NULL DEFAULT '';
UPDATE USERS SET LOGIN_OLD=LOGIN;
ALTER TABLE USERS DROP COLUMN LOGIN;
ALTER TABLE USERS RENAME COLUMN LOGIN_OLD TO LOGIN;
CALL SYSPROC.ADMIN_CMD('REORG TABLE USERS');
ALTER 命令的语法在其他 DBMS 中可能不同
【讨论】:
【参考方案12】:FOR SQL 删除约束
ALTER TABLE [dbo].[tablename] DROP CONSTRAINT [由 sql 创建的唯一键] 去吧
或者: 转到键 - 右键单击唯一键并单击新 sql 编辑器窗口中的放置约束。 程序会为你编写代码。
希望这会有所帮助。 消失。
【讨论】:
【参考方案13】:在任何数据库上查找所有系统生成的唯一约束名称和与之相关的其他信息。
您可以使用以下查询并根据需要对其进行增强:
SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE CONSTRAINT_NAME LIKE '%UQ%'
通过数据库删除所有唯一约束的最终查询。您可以添加 where 子句将其限制为一个表:
DECLARE @uqQuery NVARCHAR(MAX)
SET @uqQuery = SUBSTRING( (SELECT '; ' + 'ALTER TABLE [' + Table_Schema+'].['+Table_Name
+'] DROP CONSTRAINT ['+CONSTRAINT_NAME+']'
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE CONSTRAINT_NAME LIKE '%UQ%'
FOR XML PATH('')), 2, 2000000)
SELECT @uqQuery
【讨论】:
【参考方案14】: ALTER TABLE dbo.table
DROP CONSTRAINT uq_testConstrain
约束名称uq_testConstrain
可以在database->table->keys文件夹下找到
【讨论】:
【参考方案15】:MSSQL 使用以下代码
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu WHERE TABLE_NAME = 'tableName' and COLUMN_NAME = 'colName')
BEGIN
Declare @con varchar(50);
Declare @sqlStatement varchar(500);
select @con = CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu WHERE TABLE_NAME = 'tableName' and COLUMN_NAME = 'colName'
SET @sqlStatement = 'ALTER TABLE tableName DROP CONSTRAINT ' + @con;
EXECUTE (@sqlStatement)
END
GO
【讨论】:
【参考方案16】:如果您知道约束的名称,那么您可以直接使用类似的命令
alter table users 删除约束约束名称;
如果不知道约束名称,可以使用该命令获取约束
选择约束名称、约束类型 来自用户约束 其中 table_name = '你的表名';
【讨论】:
不兼容 T-SQL/MS SqlServer以上是关于如何从表列中删除唯一约束?的主要内容,如果未能解决你的问题,请参考以下文章