Posso criar uma restrição padrão nomeada em uma instrução add column no SQL Server?

163

No SQL Server, tenho uma nova coluna em uma tabela:

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

Isso falha porque eu especifico NOT NULL sem especificar uma restrição padrão. A tabela não deve ter uma restrição padrão.

Para contornar isso, eu poderia criar a tabela com a restrição padrão e removê-la.

No entanto, não parece haver nenhuma maneira de especificar que a restrição padrão deve ser nomeada como parte dessa declaração, portanto, minha única maneira de me livrar dela é ter um procedimento armazenado que a procure nos sys.default_constraints tabela.

Isso é um pouco confuso / detalhado para uma operação que provavelmente acontecerá muito. Alguém tem alguma solução melhor para isso?

GlennS
fonte

Respostas:

224

Isso deve funcionar:

ALTER TABLE t_tableName 
    ADD newColumn VARCHAR(50)
    CONSTRAINT YourContraintName DEFAULT '' NOT NULL
Joe Stefanelli
fonte
1
Funciona em 2012 também. Detalhes sangrentos
adam77
10
Por que não colocar o NOT NULLadjacente ao tipo de dados? Pode ser sintaticamente válido colocá-lo após a restrição, mas parece confuso colocá-lo lá.
Tullo_x86 7/01/19
102
ALTER TABLE t_tableName 
    ADD newColumn int NOT NULL
        CONSTRAINT DF_defaultvalue DEFAULT (1)
Mitch Wheat
fonte
22
Prefiro isso à resposta aceita, pois posso eliminar a restrição padrão sem me preocupar em perder a restrição NOT NULL.
EleventhDoctor
7
@EleventhDoctor Isso não faz sentido. O NOT NULL não é parte da restrição ea declaração queda apenas faz referência ao nome de restrição
Roger Willcocks
11
@RogerWillcocks Você está certo, mas fica mais claro ao ler que o NOT NULL é separado da restrição.
deluxxxe
10

Gostaria de adicionar alguns detalhes, pois as respostas existentes são bastante finas :

A dica mais importante é: você nunca deve criar uma restrição sem um nome explícito!

O maior problema com restrições não nomeadas : Quando você executa isso em várias máquinas clientes, você obtém nomes diferentes / aleatórios em cada uma.
Qualquer script de atualização futura será uma verdadeira dor de cabeça ...

O conselho geral é:

  • Sem restrição sem nome!
  • Use alguma convenção de nomenclatura, por exemplo
    • DF_TableName_ColumnName para uma restrição padrão
    • CK_TableName_ColumnName para uma restrição de verificação
    • UQ_TableName_ColumnName para uma restrição única
    • PK_TableName para uma restrição de chave primária

A sintaxe geral é

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

Tente isso aqui

Você pode adicionar mais restrições a cada coluna e adicionar restrições adicionais, assim como adiciona colunas após uma vírgula:

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

- insira alguns dados

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);
Shnugo
fonte
1

Tente como abaixo do 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
Arulmouzhi
fonte