¿Puedo crear una restricción predeterminada con nombre en una declaración de agregar columna en SQL Server?


163

En SQL Server, tengo una nueva columna en una tabla:

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

Esto falla porque especifico NOT NULL sin especificar una restricción predeterminada. La tabla no debe tener una restricción predeterminada.

Para evitar esto, podría crear la tabla con la restricción predeterminada y luego eliminarla.

Sin embargo, no parece haber ninguna forma de especificar que la restricción predeterminada deba nombrarse como parte de esta declaración, por lo que mi única forma de deshacerme de ella es tener un procedimiento almacenado que lo busque en sys.default_constraints mesa.

Esto es un poco desordenado / detallado para una operación que probablemente sucederá mucho. ¿Alguien tiene mejores soluciones para esto?

Respuestas:


224

Esto debería funcionar:

ALTER TABLE t_tableName 
    ADD newColumn VARCHAR(50)
    CONSTRAINT YourContraintName DEFAULT '' NOT NULL

1
Funciona en 2012 también. Detalles
sangrientos

10
¿Por qué no poner el NOT NULLadyacente al tipo de datos? Puede ser sintácticamente válido ponerlo después de la restricción, pero parece confuso ponerlo allí.
Tullo_x86

102
ALTER TABLE t_tableName 
    ADD newColumn int NOT NULL
        CONSTRAINT DF_defaultvalue DEFAULT (1)

22
Prefiero esto a la respuesta aceptada, ya que puedo eliminar la restricción predeterminada sin preocuparme por perder la restricción NOT NULL.
Undécimo

77
@EleventhDoctor Eso no tiene sentido. NOT NULL no es parte de la restricción y la instrucción drop solo hace referencia al nombre de la restricción
Roger Willcocks el

11
@RogerWillcocks Tiene razón, pero al leerlo es más claro que NOT NULL está separado de la restricción.
deluxxxe

10

Me gustaría agregar algunos detalles, ya que las respuestas existentes son bastante delgadas :

La pista más importante es: ¡Nunca debe crear una restricción sin un nombre explícito!

El mayor problema con restricciones sin nombre : cuando ejecuta esto en varias máquinas de clientes, obtendrá nombres diferentes / aleatorios en cada una.
Cualquier script de actualización futura será un verdadero dolor de cabeza ...

El consejo general es:

  • ¡Sin restricciones sin un nombre!
  • Use alguna convención de nomenclatura, p. Ej.
    • DF_TableName_ColumnName para una restricción predeterminada
    • CK_TableName_ColumnName para una restricción de verificación
    • UQ_TableName_ColumnName por una restricción única
    • PK_TableName para una restricción de clave primaria

La sintaxis general es

TheColumn <DataType> Nullability CONSTRAINT ConstraintName <ConstraintType> <ConstraintDetails>

Prueba esto aquí

Puede agregar más restricciones a cada columna y puede agregar restricciones adicionales al igual que agrega columnas después de una coma:

CREATE TABLE dbo.SomeOtherTable(TheIdThere INT NOT NULL CONSTRAINT PK_SomeOtherTable PRIMARY KEY)
GO
CREATE TABLE dbo.TestTable
(
 --define the primary key
 ID INT IDENTITY NOT NULL CONSTRAINT PK_TestTable PRIMARY KEY

 --let the string be unique (results in a unique index implicitly)
,SomeUniqueString VARCHAR(100) NOT NULL CONSTRAINT UQ_TestTable_SomeUniqueString UNIQUE

 --define two constraints, one for a default value and one for a value check
,SomeNumber INT NULL CONSTRAINT DF_TestTable_SomeNumber DEFAULT (0)
                     CONSTRAINT CK_TestTable_SomeNumber_gt100 CHECK(SomeNumber>100)

 --add a foreign key constraint
,SomeFK INT NOT NULL CONSTRAINT FK_TestTable_SomeFK FOREIGN KEY REFERENCES dbo.SomeOtherTable(TheIdThere)

 --add a constraint for two columns separately
,CONSTRAINT UQ_TestTable_StringAndNumber UNIQUE(SomeFK,SomeNumber)
);
GO

- inserte algunos datos

INSERT INTO dbo.SomeOtherTable VALUES(1);
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) VALUES('hello',111,1);
GO
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) 
VALUES('fails due to uniqueness of 111,1',111,1);

1

Intenta como debajo del script

ALTER TABLE DEMO_TABLE
ADD Column1 INT CONSTRAINT Def_Column1 DEFAULT(3) NOT NULL,
    Column2 VARCHAR(10) CONSTRAINT Def_Column2 DEFAULT('New') NOT NULL;
GO
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.