varios una tabla restricción restricciones restriccion registros quitar puede poner los errores eliminar deshabilitar delete datos consulte check anteriores sql tsql constraints default

una - restriccion check sql server



¿Cómo se elimina un valor predeterminado o una restricción similar en T-SQL? (6)

Sé la sintaxis:

ALTER TABLE [TheTable] DROP CONSTRAINT [TheDefaultConstraint]

pero ¿cómo puedo soltar la restricción predeterminada cuando no sé su nombre? (Es decir, se autogeneró en CREATE TABLE time).


Aquí va mi propia versión que descarta todas las restricciones dependientes: restricción predeterminada (si existe) y todas las restricciones de comprobación afectadas (como parece sugerir el estándar SQL y como algunas otras bases de datos lo parecen)

declare @constraints varchar(4000); declare @sql varchar(4000); with table_id_column_position as ( select object_id table_id, column_id column_position from sys.columns where object_id is not null and object_id = object_id(''TableName'') and name = ''ColumnToBeDropped'' ) select @constraints = coalesce(@constraints, ''constraint '') + ''['' + name + ''], '' from sysobjects where ( -- is CHECK constraint type = ''C'' -- dependeds on the column and id is not null and id in ( select object_id --, object_name(object_id) from sys.sql_dependencies, table_id_column_position where object_id is not null and referenced_major_id = table_id_column_position.table_id and referenced_minor_id = table_id_column_position.column_position ) ) OR ( -- is DEFAULT constraint type = ''D'' and id is not null and id in ( select object_id from sys.default_constraints, table_id_column_position where object_id is not null and parent_object_id = table_id_column_position.table_id and parent_column_id = table_id_column_position.column_position ) ); set @sql = ''alter table TableName drop '' + coalesce(@constraints, '''') + '' column ColumnToBeDropped''; exec @sql

(Cuidado: tanto TableName como ColumnToBeDropped aparecen dos veces en el código anterior)

Esto funciona construyendo una sola ALTER TABLE TableName DROP CONSTRAINT c1, ..., COLUMN ColumnToBeDropped y ejecutándola.


O puede encontrarlo utilizando la vista de catálogo sys.check_constraints.


Para una sola tabla y columna en una sola línea, use la siguiente

declare @sql nvarchar(max); set @sql = ''''; SELECT @sql+=''ALTER TABLE [dbo].[YOURTABLENAME] DROP CONSTRAINT '' + ((SELECT OBJECT_NAME(constid) FROM sysconstraints WHERE OBJECT_NAME(id) = ''YOURTABLENAME''AND colid IN (SELECT ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS Where Table_Name = ''YOURTABLENAME'' and COLUMN_NAME = ''YOURCOLUMNNAM''))) + '';''; EXEC sp_executesql @sql;

Si tiene múltiples restricciones en la columna, tendrá que discriminar sobre la restricción que está buscando, pero si tiene una restricción predeterminada, esto hará el truco.

Consulte las otras columnas disponibles en el esquema de información para que pueda seguir discriminando.


Puede encontrar el nombre de la restricción mediante sp_help [nombre de tabla] y luego soltarlo por su nombre.

O puede hacerlo a través de Management Studio.


Puede usar este código para hacerlo automáticamente:

DECLARE @tableName VARCHAR(MAX) = ''<MYTABLENAME>'' DECLARE @columnName VARCHAR(MAX) = ''<MYCOLUMNAME>'' DECLARE @ConstraintName nvarchar(200) SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID(@tableName) AND PARENT_COLUMN_ID = ( SELECT column_id FROM sys.columns WHERE NAME = @columnName AND object_id = OBJECT_ID(@tableName)) IF @ConstraintName IS NOT NULL EXEC(''ALTER TABLE ''+@tableName+'' DROP CONSTRAINT '' + @ConstraintName)

Simplemente reemplace <MYTABLENAME> y <MYCOLUMNNAME> según corresponda.


Si desea hacer esto manualmente, puede usar Management Studio para encontrarlo (debajo del nodo Restricciones dentro de la tabla).

Para hacerlo usando SQL:

  • Si las restricciones son restricciones predeterminadas, puede usar sys.default_constraints para encontrarlo:

    SELECT OBJECT_NAME(parent_object_id) AS TableName, name AS ConstraintName FROM sys.default_constraints ORDER BY TableName, ConstraintName

  • Si también está buscando otras restricciones (verificación, única, clave externa, predeterminada, clave principal), puede usar sysconstraints :

    SELECT OBJECT_NAME(id) AS TableName, OBJECT_NAME(constid) AS ConstraintName FROM sysconstraints ORDER BY TableName, ConstraintName

No dice qué versión de SQL Server está utilizando. El trabajo anterior en SQL 2005 y SQL 2008.