indexes - unique clustered index in sql server
¿Cómo eliminar una restricción única de la columna de la tabla? (11)
Tengo una tabla de ''usuarios'' con la columna ''inicio de sesión'' definida como:
[login] VARCHAR(50) UNIQUE NOT NULL
Ahora quiero eliminar esta restricción / índice único usando un script SQL. Encontré su nombre UQ_ usuarios _7D78A4E7 en mi base de datos local, pero supongo que tiene un nombre diferente en otra base de datos.
¿Cuál es la mejor manera de eliminar esta restricción única? O al menos cualquier ...
Gracias.
Esta afirmación funciona para mí
ALTER TABLE table_name DROP UNIQUE (column_name);
Esto funciona principalmente.
drop index IX_dbo_YourTableName__YourColumnName on dbo.YourTableName
GO
Expanda al nombre de la base de datos >> expanda a la tabla >> expanda a las teclas >> copie el nombre de la clave y luego ejecute el siguiente comando:
ALTER TABLE Test DROP UQ__test__3213E83EB607700F;
Aquí UQ__test__3213E83EB607700F es el nombre de la clave única que se creó en una columna particular en la tabla de prueba.
Me detuve en el script como se muestra a continuación (ya que solo tengo un índice único no agrupado en esta tabla):
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)
¿Alguien ha comentado si esta solución es aceptable? Cualquier pros y contras?
Gracias.
Me gustaría referir una pregunta anterior, porque me enfrenté al mismo problema y me resolví con esta solution . En primer lugar, una restricción siempre se crea con un valor Hash
en su nombre. Así que el problema es que este HASH
varía según la máquina o la base de datos. Por ejemplo, DF__Companies__IsGlo__6AB17FE4
aquí 6AB17FE4
es el valor de hash (8 bits). Así que me refiero a un solo guión que será fructífero para todos.
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
Se eliminará su restricción predeterminada. Sin embargo, si desea crearlo de nuevo, simplemente intente esto
ALTER TABLE [dbo].[ProcedureAlerts] ADD DEFAULT((0)) FOR [EmailSent]
Finalmente, simplemente ejecute un comando DROP
para eliminar la columna.
Para eliminar una restricción ÚNICA, no necesita el nombre de la restricción, solo la lista de columnas que se incluyen en la restricción.
La sintaxis sería:
ALTER TABLE table_name DROP UNIQUE (column1, column2, . . . )
Puedes usar el siguiente 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
SKINDER, su código no usa nombre de columna. El script correcto es:
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)
Si conoce el nombre de su restricción, puede usar directamente el comando como
alterar los usuarios de la tabla soltar la restricción nombre_constricción;
Si no conoce el nombre de la restricción, puede obtener la restricción utilizando este comando
seleccione el nombre de la restricción, el tipo de restricción de user_constraints donde table_name = ''YOUR TABLE NAME'';
Utilice este comando SQL para eliminar una restricción única:
ALTER TABLE tbl_name
DROP INDEX column_name
ALTER TABLE users
DROP CONSTRAINT ''constraints_name''