web-dev-qa-db-fra.com

Comment supprimer une contrainte unique de la colonne de table?

J'ai une table 'utilisateurs' avec la colonne 'login' définie comme:

[login] VARCHAR(50) UNIQUE NOT NULL

Maintenant, je veux supprimer cette contrainte/index unique en utilisant un script SQL. J'ai trouvé son nom UQ _users _7D78A4E7 dans ma base de données locale mais je suppose qu'il porte un nom différent sur une autre base de données.

Quel est le meilleur moyen de supprimer cette contrainte unique? Ou du moins n'importe lequel ...

Merci.

20
SKINDER

SKINDER, votre code n’utilise pas le nom de la colonne. Le script correct est:

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)
21
Rail
ALTER TABLE users
DROP CONSTRAINT 'constraints_name'
33
Avadhesh

Pour supprimer une contrainte UNIQUE, vous n'avez pas besoin du nom de la contrainte, mais seulement de la liste Des colonnes incluses dans la contrainte.

La syntaxe serait la suivante:

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

Cela fonctionne principalement.

drop index IX_dbo_YourTableName__YourColumnName on dbo.YourTableName
GO
6
Krishna

Utilisez cette commande SQL pour supprimer une contrainte unique:

ALTER TABLE tbl_name
DROP INDEX column_name
3
beginner

Cette déclaration fonctionne pour moi

  ALTER TABLE table_name DROP UNIQUE (column_name);
1
Vaseph

Vous pouvez utiliser le script suivant:

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
1
sikarnarender

Je voudrais renvoyer une question précédente, car j’ai rencontré le même problème et résolu par cette solution . Tout d’abord, une contrainte est toujours construite avec une valeur Hash dans son nom. Donc, le problème est que HASH est variable dans différentes machines ou bases de données. Par exemple, DF__Companies__IsGlo__6AB17FE4 ici 6AB17FE4 est la valeur de hachage (8 bits). Je parle donc d'un seul script qui sera fructueux pour tous 

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

Il abandonnera votre contrainte par défaut. Cependant, si vous voulez le recréer, vous pouvez simplement essayer ceci. 

ALTER TABLE [dbo].[ProcedureAlerts] ADD DEFAULT((0)) FOR [EmailSent]

Enfin, il suffit simplement d’exécuter une commande DROP pour supprimer la colonne. 

0
gdmanandamohon

Si vous connaissez le nom de votre contrainte, vous pouvez directement utiliser la commande comme

alter les utilisateurs de la table suppriment la contrainte nom_contrainte;

Si vous ne connaissez pas le nom de la contrainte, vous pouvez obtenir la contrainte en utilisant cette commande

Sélectionnez nom_contrainte, type_contrainte parmi les contraintes utilisateur où nom_table = 'VOTRE NOM DE TABLE';

0
Ramki

Je me suis arrêté sur le script comme ci-dessous (comme je n'ai que un index unique non clusterisé dans cette table):

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)

Quelqu'un at-il des commentaires si cette solution est acceptable? Des avantages et des inconvénients?

Merci.

0
SKINDER

Développez le nom de la base de données >> développez-le vers le tableau >> développez-le vers les clés >> copiez le nom de la clé puis exécutez la commande ci-dessous:

ALTER TABLE Test DROP UQ__test__3213E83EB607700F;

Ici UQ__test__3213E83EB607700F est le nom de la clé unique créée sur une colonne particulière de la table de test.

0
Jason Clark