Aggiungere una colonna con un valore predefinito a una tabella esistente in SQL Server


Risposte:


3498

Sintassi:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

Esempio:

ALTER TABLE SomeTable
        ADD SomeCol Bit NULL --Or NOT NULL.
 CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is autogenerated.
    DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

Appunti:

Nome vincolo facoltativo:
se si lascia fuori, CONSTRAINT D_SomeTable_SomeColSQL Server genererà automaticamente
    un Contraint di default con un nome divertente come:DF__SomeTa__SomeC__4FB7FEF6

Opzionale con-Valori Dichiarazione:
L' WITH VALUESè necessaria solo quando la colonna è Nullable
    e si desidera che il valore predefinito utilizzato per le schede esistenti.
Se la tua colonna lo è NOT NULL, utilizzerà automaticamente il valore predefinito
    per tutti i record esistenti, indipendentemente dal fatto che tu lo specifichi WITH VALUESo meno.

Funzionamento degli inserti con un vincolo predefinito:
se si inserisce un record SomeTablee non si specifica SomeColil valore, verrà impostato su Predefinito 0.
Se si inserisce un record e si specifica SomeColil valore come NULL(e la colonna consente valori null),
    il vincolo predefinito non verrà utilizzato e NULLverrà inserito come valore.

Le note si basavano sul fantastico feedback di tutti di seguito.
Un ringraziamento speciale a:
    @Yatrix, @WalterStabosz, @YahooSerious e @StackMan per i loro commenti.


332
Tieni presente che se la colonna è nullable, allora null sarà il valore utilizzato per le righe esistenti.
Richard Collette,

17
@Thecrocodilehunter La colonna Nullable indica che è possibile inserire Null per il valore delle colonne. Se non è una colonna nullable, devi inserire un valore per quel tipo di dati. Pertanto, per i record esistenti, verrà inserito Null in essi e nei nuovi record, verrà inserito il valore predefinito, se non diversamente specificato. Ha senso?
Yatrix,

41
Mi piace questa risposta un po 'meglio di dbugger perché nomina esplicitamente il vincolo predefinito. Un vincolo predefinito viene comunque creato utilizzando la sintassi di dbugger, tranne per il fatto che il suo nome viene generato automaticamente. Conoscere il nome esatto è utile quando si scrivono script DROP-CREATE.
Walter Stabosz,

18
@Vertigo Questo è SOLO vero se la colonna è NOT NULL. Prova questo: create table blah(a int not null primary key clustered); insert blah values (1), (2); alter table blah add b int null constraint df_blah_b default (0); select * from blah;vedrai 2 valori NULL per la colonna b.
ErikE,

48
Utilizzare WITH VALUESper aggiornare le righe nullable esistenti. Vedere MSDN : "Se la colonna aggiunta consente valori null ed WITH VALUESè specificata, il valore predefinito viene archiviato nella nuova colonna, aggiunta alle righe esistenti."
Yahoo Serio,

1008
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

L'inclusione di DEFAULT riempie la colonna nelle righe esistenti con il valore predefinito, quindi il vincolo NOT NULL non viene violato.


13
Il problema con quella risposta è che il valore predefinito è valido solo per i nuovi record. I record esistenti avranno comunque valore NULL.
Roee Gavirel,

130
Scoprirai che non è così. Altrimenti il ​​vincolo verrebbe violato.
dbugger

35
Le colonne nelle righe esistenti sono riempite con il valore predefinito. Un piccolo test empirico lo dimostrerà.
dbugger

80
Solo per chiarire: se "NON NULL" viene omesso dal comando, il valore per le righe esistenti NON verrà aggiornato e rimarrà NULL. Se "NOT NULL" è incluso nel comando, il valore per le righe esistenti verrà aggiornato in modo che corrisponda al valore predefinito.
Stack Man

15
Per più colonne ALTER TABLE table_1 AGGIUNGI col_1 int NON NULL DEFAULT (1), col_2 int NULL
aads

233

Quando si aggiunge una colonna nullable , WITH VALUESsi assicurerà che il valore DEFAULT specifico venga applicato alle righe esistenti:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES

13
Questo è un punto chiave. È facile supporre che una colonna con un DEFAULTvincolo abbia sempre un valore, ovvero non sia NULL, anche se NOT NULLnon è specificato.
Bill Brinkley,

6
@tkocmathla, non stavo parlando del BITtipo di dati, stavo parlando di questa particolare BIT colonna . Guarda la risposta, la colonna è dichiarata come NOT NULL.
rsenna,

136
ALTER TABLE <table name> 
ADD <new column name> <data type> NOT NULL
GO
ALTER TABLE <table name> 
ADD CONSTRAINT <constraint name> DEFAULT <default value> FOR <new column name>
GO

7
Questo non funzionerà se la tabella ha già contenuto perché la nuova colonna "non nullable" viene creata prima del vincolo del valore predefinito
WDuffy,

129
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'

13
questo aggiungere null! non deve essere null prima
baaroz,

5
@baaroz, funziona con NOT NULL: ALTER TABLE MYTABLE AGGIUNGI MYNEWCOLUMN VARCHAR (200) NON NULL DEFAULT 'SNUGGLES'
shaijut

100

Fai attenzione quando la colonna che stai aggiungendo ha un NOT NULLvincolo, ma non ha un DEFAULTvincolo (valore). In ALTER TABLEtal caso, l'istruzione avrà esito negativo se la tabella contiene righe. La soluzione è rimuovere il NOT NULLvincolo dalla nuova colonna o fornire un DEFAULTvincolo per esso.


2
qualche esempio SQL a riguardo?
Kiquenet,

98

La versione più semplice con solo due righe

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

81

Uso:

-- Add a column with a default DateTime  
-- to capture when each record is added.

ALTER TABLE myTableName  
ADD RecordAddedDate SMALLDATETIME NULL DEFAULT (GETDATE())  
GO 

79

Se si desidera aggiungere più colonne, è possibile farlo in questo modo, ad esempio:

ALTER TABLE YourTable
    ADD Column1 INT NOT NULL DEFAULT 0,
        Column2 INT NOT NULL DEFAULT 1,
        Column3 VARCHAR(50) DEFAULT 'Hello'
GO


54

Per aggiungere una colonna a una tabella di database esistente con un valore predefinito, possiamo usare:

ALTER TABLE [dbo.table_name]
    ADD [Column_Name] BIT NOT NULL
Default ( 0 )

Ecco un altro modo per aggiungere una colonna a una tabella di database esistente con un valore predefinito.

Di seguito è riportato uno script SQL molto più completo per aggiungere una colonna con un valore predefinito, incluso il controllo della presenza della colonna prima di aggiungerla, inoltre il controllo del vincolo e la sua eliminazione, se presente. Questo script nomina anche il vincolo in modo da poter avere una bella convenzione di denominazione (mi piace DF_) e in caso contrario SQL ci darà un vincolo con un nome che ha un numero generato casualmente; quindi è bello poter nominare anche il vincolo.

-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
            SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = 'table_Emplyee'
              AND COLUMN_NAME = 'Column_EmployeeName'
           )
    BEGIN

        IF EXISTS ( SELECT 1
                    FROM sys.default_constraints
                    WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
                      AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
                  )
            BEGIN
                ------  DROP Contraint

                ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
            PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
            END
     --    -----   DROP Column   -----------------------------------------------------------------
        ALTER TABLE [dbo].table_Emplyee
            DROP COLUMN Column_EmployeeName
        PRINT 'Column Column_EmployeeName in images table was dropped'
    END

--------------------------------------------------------------------------
-- ADD  COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
                SELECT 1
                FROM INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'table_Emplyee'
                  AND COLUMN_NAME = 'Column_EmployeeName'
               )
    BEGIN
    ----- ADD Column & Contraint
        ALTER TABLE dbo.table_Emplyee
            ADD Column_EmployeeName BIT   NOT NULL
            CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]  DEFAULT (0)
        PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
        PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
     END

GO

Questi sono due modi per aggiungere una colonna a una tabella di database esistente con un valore predefinito.


52

Puoi fare la cosa con T-SQL nel modo seguente.

 ALTER TABLE {TABLENAME}
 ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
 CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}

Oltre a utilizzare SQL Server Management Studio, puoi anche fare clic con il pulsante destro del mouse sulla tabella nel menu Progettazione, impostando il valore predefinito su tabella.

Inoltre, se si desidera aggiungere la stessa colonna (se non esiste) a tutte le tabelle nel database, utilizzare:

 USE AdventureWorks;
 EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;

50

In SQL Server 2008-R2, vado in modalità progettazione - in un database di prova - e aggiungo le mie due colonne usando il designer e ho fatto le impostazioni con la GUI, e poi il famigerato Right-Clickdà l'opzione " Genera script di modifica "!

Bang up apre una piccola finestra con, avete indovinato, lo script di modifica garantito per funzionare correttamente formattato. Premi il pulsante facile.


48

In alternativa, puoi aggiungere un valore predefinito senza dover assegnare un nome esplicito al vincolo:

ALTER TABLE [schema].[tablename] ADD  DEFAULT ((0)) FOR [columnname]

Se si verificano problemi con i vincoli predefiniti esistenti durante la creazione di questo vincolo, è possibile rimuoverli mediante:

alter table [schema].[tablename] drop constraint [constraintname]

1
Cordiali saluti, denominazione esplicita del vincolo utilizzando uno schema di denominazione standard (ad esempio "DF_Table_Column"), per facilità di manutenzione. Altrimenti, individuare il vincolo richiede più lavoro.
Mike Christian,

43

Questo può essere fatto anche nella GUI di SSMS. Mostro una data predefinita di seguito, ma il valore predefinito può essere qualunque, ovviamente.

  1. Metti la tua tabella in visualizzazione struttura (fai clic con il pulsante destro del mouse sulla tabella in Esplora oggetti-> Progettazione)
  2. Aggiungi una colonna alla tabella (o fai clic sulla colonna che desideri aggiornare se esiste già)
  3. In Proprietà colonna di seguito, immettere (getdate())o abco 0qualsiasi valore desiderato nel campo Valore predefinito o Binding come mostrato di seguito:

inserisci qui la descrizione dell'immagine



31

Esempio:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO


22

Innanzitutto crea una tabella con nome studente:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Aggiungi una colonna ad essa:

ALTER TABLE STUDENT 
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)

SELECT * 
FROM STUDENT

La tabella viene creata e una colonna viene aggiunta a una tabella esistente con un valore predefinito.

Immagine 1


19

Questo ha molte risposte, ma sento la necessità di aggiungere questo metodo esteso. Sembra molto più lungo, ma è estremamente utile se si aggiunge un campo NOT NULL a una tabella con milioni di righe in un database attivo.

ALTER TABLE {schemaName}.{tableName}
    ADD {columnName} {datatype} NULL
    CONSTRAINT {constraintName} DEFAULT {DefaultValue}

UPDATE {schemaName}.{tableName}
    SET {columnName} = {DefaultValue}
    WHERE {columName} IS NULL

ALTER TABLE {schemaName}.{tableName}
    ALTER COLUMN {columnName} {datatype} NOT NULL

Ciò che farà sarà aggiungere la colonna come campo nullable e con il valore predefinito, aggiornare tutti i campi al valore predefinito (oppure è possibile assegnare valori più significativi), e infine cambierà la colonna in NOT NULL.

Il motivo è se aggiorni una tabella di grandi dimensioni e aggiungi un nuovo campo non nullo che deve scrivere su ogni singola riga e con ciò bloccherà l'intera tabella man mano che aggiunge la colonna e quindi scrive tutti i valori.

Questo metodo aggiungerà la colonna nullable che opera molto più velocemente da sola, quindi riempie i dati prima di impostare lo stato non nullo.

Ho scoperto che fare tutto in una frase bloccherà una delle nostre tabelle più attive per 4-8 minuti e abbastanza spesso ho interrotto il processo. Questo metodo di solito ogni parte richiede solo pochi secondi e provoca un blocco minimo.

Inoltre, se hai una tabella nell'area di miliardi di righe, vale la pena raggruppare l'aggiornamento in questo modo:

WHILE 1=1
BEGIN
    UPDATE TOP (1000000) {schemaName}.{tableName}
        SET {columnName} = {DefaultValue}
        WHERE {columName} IS NULL

    IF @@ROWCOUNT < 1000000
        BREAK;
END

18

Prova questo

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO

18

SQL Server + Modifica tabella + Aggiungi colonna + Valore predefinito ID univoco

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))

18
IF NOT EXISTS (
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME'
)
BEGIN
    ALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) Not Null default
END

3
Mi piace il NOT EXISTScontrollo prima di provare a modificare la tabella. Ottima soluzione Qualche commento aggiuntivo su come funziona lo renderebbe ancora più utile.
Michael Gaskill,

17
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO

Forse sostituire l'immagine con il codice attuale? Difficile da copiare e incollare così com'è.
David Faber,

6
Ciò non aggiunge alcun valore rispetto alle risposte già esistenti di anni fa.
nvoigt,

14

Aggiungi una nuova colonna a una tabella:

ALTER TABLE [table]
ADD Column1 Datatype

Per esempio,

ALTER TABLE [test]
ADD ID Int

Se l'utente desidera farlo incrementare automaticamente, allora:

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL

13

Questo è per SQL Server:

ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES

Esempio:

ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES

Se si desidera aggiungere vincoli, allora:

ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES

7
Ciò non aggiunge alcun valore rispetto alle risposte già esistenti di anni fa.
nvoigt,

11

Questo può essere fatto con il seguente codice.

CREATE TABLE TestTable
    (FirstCol INT NOT NULL)
    GO
    ------------------------------
    -- Option 1
    ------------------------------
    -- Adding New Column
    ALTER TABLE TestTable
    ADD SecondCol INT
    GO
    -- Updating it with Default
    UPDATE TestTable
    SET SecondCol = 0
    GO
    -- Alter
    ALTER TABLE TestTable
    ALTER COLUMN SecondCol INT NOT NULL
    GO

10

Prova con la query seguente:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

Ciò aggiungerà una nuova colonna nella tabella.


6
questa risposta data da un altro utente per questa domanda
janith1024

9
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

Da questa query è possibile aggiungere una colonna di tipo di dati intero con valore predefinito 0.


9

Bene, ora ho alcune modifiche alla mia risposta precedente. Ho notato che nessuna delle risposte menzionate IF NOT EXISTS. Quindi fornirò una nuova soluzione in quanto ho riscontrato alcuni problemi nel modificare la tabella.

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'TaskSheet' AND column_name = 'IsBilledToClient')
BEGIN
ALTER TABLE dbo.TaskSheet ADD
 IsBilledToClient bit NOT NULL DEFAULT ((1))
END
GO

Ecco TaskSheetil nome particolare della tabella ed IsBilledToClientè la nuova colonna che si intende inserire e 1il valore predefinito. Ciò significa che nella nuova colonna quale sarà il valore delle righe esistenti, quindi uno verrà impostato automaticamente lì. Tuttavia, puoi cambiare come desideri con il rispetto del tipo di colonna come ho usatoBIT , quindi ho inserito il valore predefinito 1.

Suggerisco il sistema precedente, perché ho riscontrato un problema. Quindi qual'è il problema? Il problema è che se la IsBilledToClientcolonna esiste nella tabella della tabella, se si esegue solo la parte del codice fornita di seguito, verrà visualizzato un errore nel generatore di query del server SQL. Ma se non esiste, per la prima volta non ci saranno errori durante l'esecuzione.

ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]
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.