18

que tengo con la columna 'login' una mesa de 'usuarios' define como:¿Cómo se elimina una restricción única de la columna de la tabla?

[login] VARCHAR(50) UNIQUE NOT NULL 

Ahora quiero eliminar esta restricción UNIQUE/índice mediante secuencias de comandos 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.

+4

http://stackoverflow.com/questions/1430456/how-to-drop-sql-default-constraint-without-knowing-its-name –

+0

@Mitch Wheat: Encontré mi restricción única en la tabla sys.indexes pero No he encontrado ningún enlace a la tabla que contenga este índice. ¿Alguna ayuda? – SKINDER

+0

@Mitch Wheat: He encontrado un enlace a mi tabla, es object_id, pero no puedo encontrar un enlace a la columna necesaria ... – SKINDER

Respuesta

17

SKINDER, su código no utiliza el nombre de la columna. la escritura correcta 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 [email protected]_name 

print @Command 

--execute (@Command) 
+1

Esto se rompería si hay más de una restricción única en la columna. Las restricciones únicas pueden abarcar más de una columna, y es posible que una columna sea parte de más de una restricción única. – Jim

27
ALTER TABLE users 
DROP CONSTRAINT 'constraints_name' 
+5

)) sí, 'constraints_name' ... pero ¿QUÉ ES ESTE NOMBRE DE RESTRICCIÓN? – SKINDER

+2

el nombre de la restricción es aleatorio. Si desea que se solucione, debe asignarle un nombre en la creación. 'Usuarios de CREATE TABLE (login varchar (50) constraint uq_users_login UNIQUE)' –

+0

@Filip De Vos: esta tabla ya ha sido creada. Y ahora no puedo eliminar este índice usando script. ¿Hay alguna solución, excepto copiar datos en una tabla nueva sin restricciones y eliminar la tabla anterior (es bastante difícil porque tengo claves externas que se vinculan a otra columna en esta tabla)? – SKINDER

0

me han dejado en el guión como el de abajo (como lo he hecho solamente uno í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 comenta si esta solución es aceptable? Cualquier pros y contras?

Gracias.

+0

Si funciona, entonces es un buen script :) no trabaje sobre el problema si esto ha resuelto su problema. No es como si estuvieras ejecutando un script como este cada minuto. – Tony

1

Usted puede utilizar secuencia de comandos siguiente:

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

Esto funciona en su mayoría.

drop index IX_dbo_YourTableName__YourColumnName on dbo.YourTableName 
GO 
+0

En SSMS 17, esto es lo que "Drop index Xyz" genera a través de SMO en una instancia de SQL Server 2016. –

5

para dejar caer una restricción UNIQUE, no es necesario el nombre de la restricción, sólo la lista de de columnas que están incluidos en la restricción.

La sintaxis sería:

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

La pregunta está etiquetada SQL-Server no MySQL. – bummi

2

Use este comando SQL para dejar caer una restricción única:

ALTER TABLE tbl_name 
DROP INDEX column_name 
+0

Msg 1018, nivel 15, estado 1, línea 2 Sintaxis incorrecta cerca de 'INDEX'. Si esto se pretende como parte de una sugerencia de tabla, ahora se requiere una palabra clave y paréntesis A WITH. Consulte los Libros en pantalla de SQL Server para obtener la sintaxis adecuada. – jlg

+0

Error al ejecutar la consulta de la base de datos. 'column_name' no es una restricción. –

+0

@PradeepKumarPrabaharan que 'column_name' debe ser reemplazado por su nombre de columna – beginner

0

Si conoce el nombre de su limitación a continuación, puede utilizar directamente el comando como

alter table users drop constraint constraint_name;

Si no conoce el nombre de restricción, se puede obtener la limitación mediante el uso de este comando

seleccione constraint_name, CONSTRAINT_TYPE de USER_CONSTRAINTS donde nombre_tabla = 'Su Nombre de la tabla';

0

Esta declaración funciona para mí

ALTER TABLE table_name DROP UNIQUE (column_name); 
0

se expanden para expandir >> nombre de la base a la tabla >> expanden para llaves >> copiar el nombre de la clave a continuación, ejecutar 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.

0

Me gustaría referirme a una pregunta anterior, porque me he enfrentado el mismo problema y lo he solucionado con este solution. En primer lugar, una restricción siempre se genera con un valor de Hash en su nombre. Entonces el problema es que HASH varía en diferentes máquinas o bases de datos. Por ejemplo DF__Companies__IsGlo__6AB17FE4 aquí 6AB17FE4 es el valor hash (8 bit). Así que me refiero a un único script 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 

Caerá su restricción predeterminada. Sin embargo, si desea crear de nuevo sólo tiene que probar este

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

Por último, simplemente ejecutar un comando DROP dejar caer la columna.

Cuestiones relacionadas