È possibile creare un vincolo predefinito denominato in un'istruzione di aggiunta colonna in SQL Server?


163

In SQL Server, ho una nuova colonna su una tabella:

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

Questo non riesce perché specifico NOT NULL senza specificare un vincolo predefinito. La tabella non dovrebbe avere un vincolo predefinito.

Per ovviare a questo, ho potuto creare la tabella con il vincolo predefinito e quindi rimuoverlo.

Tuttavia, non sembra esserci alcun modo per specificare che il vincolo predefinito debba essere nominato come parte di questa affermazione, quindi il mio unico modo per sbarazzartene è avere una procedura memorizzata che la cerchi nei sys.default_constraints tavolo.

Questo è un po 'disordinato / prolisso per un'operazione che potrebbe succedere molto. Qualcuno ha soluzioni migliori per questo?

Risposte:



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

22
Preferisco questo alla risposta accettata in quanto posso eliminare il vincolo predefinito senza preoccuparmi di perdere il vincolo NOT NULL.
Undicesimo

7
@EleventhDoctor Non ha senso. NOT NULL non fa parte del vincolo e l'istruzione drop fa semplicemente riferimento al nome del vincolo
Roger Willcocks,

11
@RogerWillcocks Hai ragione, ma è più chiaro leggendolo che NOT NULL è separato dal vincolo.
deluxxxe,

10

Vorrei aggiungere alcuni dettagli, poiché le risposte esistenti sono piuttosto sottili :

Il suggerimento più importante è: non devi mai creare un vincolo senza un nome esplicito!

Il problema più grande con vincoli senza nome : quando lo esegui su vari computer dei clienti, otterrai nomi diversi / casuali su ciascuno.
Ogni futuro script di aggiornamento sarà un vero mal di testa ...

Il consiglio generale è:

  • Nessun vincolo senza un nome!
  • Utilizzare alcune convenzioni di denominazione, ad es
    • DF_TableName_ColumnName per un vincolo predefinito
    • CK_TableName_ColumnName per un vincolo di controllo
    • UQ_TableName_ColumnName per un vincolo unico
    • PK_TableName per un vincolo chiave primaria

La sintassi generale è

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

Prova qui

Puoi aggiungere più vincoli a ciascuna colonna e puoi aggiungere ulteriori vincoli così come aggiungi colonne dopo una virgola:

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

--inserire alcuni dati

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

Prova come sotto lo 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.