Подтвердить что ты не робот

Как удалить уникальное ограничение из столбца таблицы?

У меня есть таблица 'users' со столбцом 'login', определяемым как:

[login] VARCHAR(50) UNIQUE NOT NULL

Теперь я хочу удалить это уникальное ограничение/индекс, используя SQL script. Я нашел его имя UQ_users_7D78A4E7 в моей локальной базе данных, но я полагаю, что оно имеет другое имя в другой базе данных.

Каков наилучший способ отказаться от этого уникального ограничения? Или, по крайней мере, любой...

Спасибо.

4b9b3361

Ответ 1

SKINDER, ваш код не использует имя столбца. Правильно script:

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)

Ответ 2

ALTER TABLE users
DROP CONSTRAINT 'constraints_name'

Ответ 3

Это работает в основном.

drop index IX_dbo_YourTableName__YourColumnName on dbo.YourTableName
GO

Ответ 4

Чтобы сбросить ограничение UNIQUE, вам не нужно имя ограничения, просто список столбцов, включенных в ограничение.

Синтаксис:

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

Ответ 5

Используйте эту команду SQL, чтобы удалить уникальное ограничение:

ALTER TABLE tbl_name
DROP INDEX column_name

Ответ 6

Вы можете использовать следующие script:

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

Ответ 7

Это утверждение работает для меня

  ALTER TABLE table_name DROP UNIQUE (column_name);

Ответ 8

Я остановился на script, как показано ниже (поскольку у меня есть только один некластеризованный уникальный индекс в этой таблице):

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)

Кто-нибудь комментирует, допустимо ли это решение? Любые плюсы и минусы?

Спасибо.

Ответ 9

Развернуть имя базы данных → expand в таблицу → expand to keys → скопировать имя ключа, затем выполнить следующую команду:

ALTER TABLE Test DROP UQ__test__3213E83EB607700F;

Здесь UQ__test__3213E83EB607700F - это имя уникального ключа, который был создан в конкретном столбце тестовой таблицы.

Ответ 10

Я хотел бы упомянуть предыдущий вопрос, потому что я столкнулся с той же проблемой и решил этот решение. Прежде всего ограничение всегда строится с именем Hash в нем. Таким образом, проблема заключается в том, что Hash варьируется в разных машинах или в базе данных. Например DF__Companies__IsGlo__6AB17FE4 здесь 6AB17FE4 - это значение хеша (8 бит). Поэтому я имею в виду единственный script, который будет плодотворным для всех

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. То, что я сделал, немного не слишком профессиональное решение, но оно работает в каждой СУБД:

  1. Добавьте столбец с таким же определением без единого ограничения.
  2. Скопируйте значения из исходного столбца в новый
  3. Удалите исходный столбец (чтобы СУБД также убрала ограничение, независимо от того, какое у него имя)
  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 может быть другим в других СУБД

Ответ 12

Если вы знаете имя своего ограничения, вы можете напрямую использовать команду, например

изменить имя пользователя таблицы ограничение ограничения имя_контакта

Если вы не знаете имя ограничения, вы можете получить ограничение, используя эту команду

выберите имя ограничения, constraint_type пользователя user_constraints где table_name = 'YOUR TABLE NAME';