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

问题描述 投票:0回答:17

我有一个表“用户”,其中“登录”列定义为:

[login] VARCHAR(50) UNIQUE NOT NULL

现在我想使用 SQL 脚本删除这个唯一的约束/索引。我在本地数据库中找到了它的名称 UQ_users_7D78A4E7,但我认为它在另一个数据库上有不同的名称。

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

谢谢。

sql database sql-server-2005 unique-constraint non-clustered-index
17个回答
36
投票
ALTER TABLE users
DROP CONSTRAINT 'constraints_name'

如果没有提供早期的constraint_name,它将有一些默认的constraint_name,在pgAdmin 4(pSql)中,尝试违反约束,您可以在收到的错误中看到constraint_name被违反,很可能与其他平台的情况相同或网络上有一些文章,其中constraint_name是从存储它们的某些表中提取的,但对此不确定。 P.S:也可以参考评论


26
投票

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)

10
投票

这大部分都有效。

drop index IX_dbo_YourTableName__YourColumnName on dbo.YourTableName
GO

8
投票

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

语法为:

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

3
投票

您可以使用以下脚本:

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

3
投票

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

ALTER TABLE tbl_name
DROP INDEX column_name

2
投票

这个说法对我有用

  ALTER TABLE table_name DROP UNIQUE (column_name);

0
投票

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

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
投票

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

ALTER TABLE Test DROP UQ__test__3213E83EB607700F;

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


0
投票

我想参考之前的问题,因为我也遇到过同样的问题并通过这个解决方案解决了。 首先,约束总是在其名称中包含

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
命令即可删除该列。


0
投票

我也有同样的问题。我正在使用 DB2。我所做的是有点不太专业的解决方案,但它适用于每个 DBMS:

  1. 添加具有相同定义但没有唯一约束的列。
  2. 将值从原始列复制到新列
  3. 删除原始列(因此 DBMS 也会删除约束,无论其名称是什么)
  4. 最后将新名称重命名为原来的
  5. 最后进行重组(仅在 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 中可能有所不同


0
投票

FOR SQL 删除约束

ALTER TABLE [dbo].[表名] DROP CONSTRAINT [sql 创建的唯一键] 去吧

或者: 转到键 - 右键单击唯一键,然后在新的 sql 编辑器窗口中单击删除约束。 该程序为您编写代码。

希望这有帮助。 阿尼什。


0
投票

在任何数据库上查找所有系统生成的唯一约束名称以及与其相关的其他信息。

您可以使用以下查询并根据您的需要增强它:

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

0
投票
   ALTER TABLE dbo.table
DROP CONSTRAINT uq_testConstrain

约束名称

uq_testConstrain
可以在database->table->keys文件夹下找到


0
投票

对于 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

0
投票

对于 Sql server 2014,您可以使用以下查询删除唯一键

首先使用

找到唯一的键名

执行 sys.sp_helpindex @objname = N't_Party'

DROP INDEX [KEY_NAME] ON [dbo].[TABLE_NAME]

--In my case there ys t_Party table name and 'IX_t_Party' this is unique key name

DROP INDEX [IX_t_Party] ON [dbo].[t_Party]

-1
投票

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

更改表用户删除约束constraint_name;

如果您不知道约束名称,可以使用此命令获取约束

选择约束名称、约束类型 来自用户约束 其中 table_name = '您的表名称';

© www.soinside.com 2019 - 2024. All rights reserved.