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.
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)
ALTER TABLE users
DROP CONSTRAINT 'constraints_name'
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, . . . )
Cela fonctionne principalement.
drop index IX_dbo_YourTableName__YourColumnName on dbo.YourTableName
GO
Utilisez cette commande SQL pour supprimer une contrainte unique:
ALTER TABLE tbl_name
DROP INDEX column_name
Cette déclaration fonctionne pour moi
ALTER TABLE table_name DROP UNIQUE (column_name);
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
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.
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';
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.
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.