Ajouter une colonne avec une valeur par défaut à une table existante dans SQL Server

Réponses:

3498

Syntaxe:

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

Exemple:

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.

Remarques:

Nom de contrainte facultatif:
si vous CONSTRAINT D_SomeTable_SomeColomettez, SQL Server générera automatiquement
    une contrainte par défaut avec un nom drôle comme:DF__SomeTa__SomeC__4FB7FEF6

Instruction With-Values ​​facultative:
la WITH VALUESest nécessaire uniquement lorsque votre colonne est Nullable
    et que vous souhaitez que la valeur par défaut soit utilisée pour les enregistrements existants.
Si votre colonne l'est NOT NULL, elle utilisera automatiquement la valeur par défaut
    pour tous les enregistrements existants, que vous le spécifiiez WITH VALUESou non.

Fonctionnement des insertions avec une contrainte par défaut:
Si vous insérez un enregistrement dans SomeTableet ne spécifiez pasSomeCol la valeur de, il sera défini par défaut sur 0.
Si vous insérez un enregistrement et spécifiez SomeColla valeur de NULL(et que votre colonne autorise les valeurs nulles),
    la contrainte par défaut ne sera pas utilisée et NULLsera insérée en tant que valeur.

Les notes étaient basées sur les excellents commentaires de chacun ci-dessous.
Un merci spécial à:
    @Yatrix, @WalterStabosz, @YahooSerious et @StackMan pour leurs commentaires.

James Boother
la source
332
Gardez à l'esprit que si la colonne est nullable, alors null sera la valeur utilisée pour les lignes existantes.
Richard Collette
17
La colonne @Thecrocodilehunter Nullable signifie que vous pouvez insérer Null pour la valeur des colonnes. Si ce n'est pas une colonne nullable, vous devez insérer une valeur de ce type de données. Ainsi, pour les enregistrements existants, Null y sera inséré et dans les nouveaux enregistrements, votre valeur par défaut sera insérée, sauf indication contraire. Ça a du sens?
Yatrix
41
J'aime cette réponse un peu mieux que celle de dbugger car elle nomme explicitement la contrainte par défaut. Une contrainte par défaut est toujours créée à l'aide de la syntaxe de dbugger, sauf que son nom est généré automatiquement. Connaître le nom exact est pratique lors de l'écriture de scripts DROP-CREATE.
Walter Stabosz
18
@Vertigo Cela n'est vrai que si la colonne l'est NOT NULL. Veuillez essayer ceci: 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;vous verrez 2 valeurs NULL pour la colonne b.
ErikE
48
Utilisez WITH VALUESpour mettre à jour les lignes annulables existantes. Voir MSDN : "Si la colonne ajoutée autorise les valeurs nulles et WITH VALUESest spécifiée, la valeur par défaut est stockée dans la nouvelle colonne, ajoutée aux lignes existantes."
Yahoo Serious
1008
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

L'inclusion de DEFAULT remplit la colonne dans les lignes existantes avec la valeur par défaut, de sorte que la contrainte NOT NULL n'est pas violée.

dbugger
la source
13
Le problème avec cette réponse est que la valeur par défaut n'est valide que pour les nouveaux enregistrements. Les enregistrements existants auront toujours la valeur NULL.
Roee Gavirel
130
Vous constaterez que ce n'est pas le cas. Sinon, la contrainte serait violée.
dbugger
35
Les colonnes des lignes existantes sont remplies avec la valeur par défaut. Un petit test empirique le prouvera.
dbugger
80
Juste pour clarifier - si "NOT NULL" est omis de la commande, la valeur des lignes existantes ne sera PAS mise à jour et restera NULL. Si "NOT NULL" est inclus dans la commande, la valeur des lignes existantes SERA mise à jour pour correspondre à la valeur par défaut.
Stack Man
15
Pour plusieurs colonnes ALTER TABLE table_1 ADD col_1 int NOT NULL DEFAULT (1), col_2 int NULL
aads
233

Lorsque vous ajoutez une colonne nullable , vous vous WITH VALUESassurerez que la valeur DEFAULT spécifique est appliquée aux lignes existantes:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
phunk_munkie
la source
13
Ceci est un point clé. Il est facile de supposer qu'une colonne avec une DEFAULTcontrainte aura toujours une valeur - c'est-à-dire qu'elle ne sera pas NULL, même si elle NOT NULLn'est pas spécifiée.
Bill Brinkley
6
@tkocmathla euh, je ne parlais pas du BITtype de données, je parlais de cette BIT colonne particulière . Regardez la réponse, la colonne est déclarée comme 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
ddc0660
la source
7
Cela ne fonctionnera pas si le tableau contient déjà du contenu car la nouvelle colonne "non nullable" est créée avant la contrainte de valeur par défaut
WDuffy
129
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
Evan V
la source
13
cet ajout null! doit être non nul avant
baaroz
5
@baaroz, cela fonctionne avec NOT NULL: ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR (200) NOT NULL DEFAULT 'SNUGGLES'
shaijut
100

Attention lorsque la colonne que vous ajoutez a une NOT NULLcontrainte, mais n'a pas de DEFAULTcontrainte (valeur). L' ALTER TABLEinstruction échouera dans ce cas si la table contient des lignes. La solution consiste soit à supprimer la NOT NULLcontrainte de la nouvelle colonne, soit à lui fournir une DEFAULTcontrainte.

jalbert
la source
2
un exemple SQL à ce sujet?
Kiquenet
98

La version la plus basique avec deux lignes seulement

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0
adeel41
la source
81

Utilisation:

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

ALTER TABLE myTableName  
ADD RecordAddedDate SMALLDATETIME NULL DEFAULT (GETDATE())  
GO 
JerryOL
la source
79

Si vous souhaitez ajouter plusieurs colonnes, vous pouvez le faire de cette façon, par exemple:

ALTER TABLE YourTable
    ADD Column1 INT NOT NULL DEFAULT 0,
        Column2 INT NOT NULL DEFAULT 1,
        Column3 VARCHAR(50) DEFAULT 'Hello'
GO
Gabriel L.
la source
56

Utilisation:

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

Référence: ALTER TABLE (Transact-SQL) (MSDN)

giá vàng
la source
54

Pour ajouter une colonne à une table de base de données existante avec une valeur par défaut, nous pouvons utiliser:

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

Voici une autre façon d'ajouter une colonne à une table de base de données existante avec une valeur par défaut.

Un script SQL beaucoup plus approfondi pour ajouter une colonne avec une valeur par défaut est ci-dessous, y compris vérifier si la colonne existe avant de l'ajouter également archiver la contrainte et la supprimer s'il y en a une. Ce script nomme également la contrainte afin que nous puissions avoir une belle convention de dénomination (j'aime DF_) et sinon SQL nous donnera une contrainte avec un nom qui a un nombre généré aléatoirement; donc c'est bien de pouvoir aussi nommer la contrainte.

-------------------------------------------------------------------------
-- 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

Il existe deux façons d'ajouter une colonne à une table de base de données existante avec une valeur par défaut.

Catto
la source
52

Vous pouvez faire la chose avec T-SQL de la manière suivante.

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

Vous pouvez également utiliser SQL Server Management Studio en cliquant avec le bouton droit sur la table dans le menu Conception, en définissant la valeur par défaut sur table.

Et de plus, si vous souhaitez ajouter la même colonne (si elle n'existe pas) à toutes les tables de la base de données, utilisez alors:

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

Dans SQL Server 2008-R2, je passe en mode conception - dans une base de données de test - et j'ajoute mes deux colonnes à l'aide du concepteur et je fais les réglages avec l'interface graphique, puis l'infâme Right-Clickdonne l'option " Générer le script de changement "!

Bang up apparaît une petite fenêtre avec, vous l'aurez deviné, le script de changement garanti au travail correctement formaté. Appuyez sur le bouton facile.

Jack
la source
48

Alternativement, vous pouvez ajouter une valeur par défaut sans avoir à nommer explicitement la contrainte:

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

Si vous rencontrez un problème avec les contraintes par défaut existantes lors de la création de cette contrainte, elles peuvent être supprimées par:

alter table [schema].[tablename] drop constraint [constraintname]
Christo
la source
1
Pour info, nommer explicitement la contrainte en utilisant un schéma de nommage standard (par exemple "DF_Table_Column"), pour faciliter la maintenance. Sinon, la localisation de la contrainte nécessite plus de travail.
Mike Christian
43

Cela peut également être fait dans l'interface graphique SSMS. Je montre une date par défaut ci-dessous mais la valeur par défaut peut être n'importe quoi, bien sûr.

  1. Mettez votre table en mode création (clic droit sur la table dans l'explorateur d'objets-> Conception)
  2. Ajoutez une colonne au tableau (ou cliquez sur la colonne que vous souhaitez mettre à jour si elle existe déjà)
  3. Dans les propriétés de colonne ci-dessous, entrez (getdate())ou abcou 0ou la valeur souhaitée dans le champ Valeur par défaut ou Liaison , comme illustré ci-dessous:

entrez la description de l'image ici

Tony L.
la source
39
ALTER TABLE ADD ColumnName {Column_Type} Constraint

L'article MSDN ALTER TABLE (Transact-SQL) a toute la syntaxe alter table.

Benjamin Autin
la source
31

Exemple:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
Andy
la source
23

Exemple:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';
Mohit Tamrakar
la source
22

Créez d'abord une table avec le nom étudiant:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Ajoutez-y une colonne:

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

SELECT * 
FROM STUDENT

La table est créée et une colonne est ajoutée à une table existante avec une valeur par défaut.

Image 1

Laxmi
la source
19

Cela a beaucoup de réponses, mais je ressens le besoin d'ajouter cette méthode étendue. Cela semble beaucoup plus long, mais il est extrêmement utile si vous ajoutez un champ NOT NULL à une table avec des millions de lignes dans une base de données active.

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

Ce que cela fera, c'est ajouter la colonne en tant que champ nullable et avec la valeur par défaut, mettre à jour tous les champs à la valeur par défaut (ou vous pouvez attribuer des valeurs plus significatives), et enfin cela changera la colonne pour qu'elle ne soit PAS NULL.

La raison en est que si vous mettez à jour une table à grande échelle et ajoutez un nouveau champ non nul, il doit écrire sur chaque ligne et verrouillera par conséquent la table entière lors de l'ajout de la colonne, puis de l'écriture de toutes les valeurs.

Cette méthode ajoutera la colonne nullable qui fonctionne beaucoup plus rapidement par elle-même, puis remplit les données avant de définir le statut non nul.

J'ai trouvé que faire tout cela dans une seule instruction verrouillerait l'une de nos tables les plus actives pendant 4 à 8 minutes et j'ai souvent tué le processus. Cette méthode, chaque partie ne prend généralement que quelques secondes et provoque un verrouillage minimal.

De plus, si vous avez une table dans la zone de milliards de lignes, il peut être utile de regrouper la mise à jour comme suit:

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

    IF @@ROWCOUNT < 1000000
        BREAK;
END
Ste Bov
la source
18

Essaye ça

ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
Jakir Hossain
la source
18

SQL Server + Modifier la table + Ajouter une colonne + Valeur par défaut uniqueidentifier

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))
Naveen Desosha
la source
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
Jeevan Gharti
la source
3
J'aime le NOT EXISTSchèque avant d'essayer de modifier la table. Très bonne solution. Quelques commentaires supplémentaires sur la façon dont cela fonctionne le rendraient encore plus utile.
Michael Gaskill
17
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
codeur sauvage
la source
Peut-être remplacer l'image par du code réel? Difficile de copier et coller tel quel.
David Faber
6
Cela n'ajoute aucune valeur aux réponses déjà existantes d'il y a des années.
nvoigt
14

Ajoutez une nouvelle colonne à une table:

ALTER TABLE [table]
ADD Column1 Datatype

Par exemple,

ALTER TABLE [test]
ADD ID Int

Si l'utilisateur souhaite l'incrémenter automatiquement, alors:

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
Chirag Thakar
la source
13

C'est pour SQL Server:

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

Exemple:

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

Si vous souhaitez ajouter des contraintes, alors:

ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
Akhil Singh
la source
7
Cela n'ajoute aucune valeur aux réponses déjà existantes d'il y a des années.
nvoigt
11

Cela peut être fait par le code ci-dessous.

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
Mohit Dagar
la source
10

Essayez avec la requête ci-dessous:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

Cela ajoutera une nouvelle colonne dans le tableau.

Anshul Dubey
la source
6
cette réponse donnée par un autre utilisateur pour cette question
janith1024
9
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

À partir de cette requête, vous pouvez ajouter une colonne d'entier de type de données avec la valeur par défaut 0.

Sandeep Kumar
la source
9

Eh bien, j'ai maintenant quelques modifications à ma réponse précédente. J'ai remarqué qu'aucune des réponses mentionnées IF NOT EXISTS. Je vais donc en apporter une nouvelle solution car j'ai rencontré des problèmes pour modifier la table.

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

Voici TaskSheetle nom de la table particulière et IsBilledToClientest la nouvelle colonne que vous allez insérer et 1la valeur par défaut. Cela signifie dans la nouvelle colonne quelle sera la valeur des lignes existantes, donc une sera automatiquement définie à cet endroit. Cependant, vous pouvez changer comme vous le souhaitez en respectant le type de colonne comme je l'ai utilisé BIT, j'ai donc mis la valeur par défaut 1.

Je suggère le système ci-dessus, car j'ai rencontré un problème. Alors quel est le problème? Le problème est que si la IsBilledToClientcolonne existe dans le tableau, alors si vous exécutez uniquement la partie du code donnée ci-dessous, vous verrez une erreur dans le générateur de requête SQL Server. Mais s'il n'existe pas, pour la première fois il n'y aura pas d'erreur lors de l'exécution.

ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]
gdmanandamohon
la source