Agregue una columna con un valor predeterminado a una tabla existente en SQL Server

Respuestas:

3498

Sintaxis:

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

Ejemplo:

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.

Notas:

Nombre de restricción opcional:
si se excluye CONSTRAINT D_SomeTable_SomeCol, SQL Server generará automáticamente
    una Contraseña predeterminada con un nombre divertido como:DF__SomeTa__SomeC__4FB7FEF6

Opcional con valores Declaración:
El WITH VALUESsólo es necesario cuando su columna es anulable
    y desea que el Valor predeterminado utilizado para los registros existentes.
Si su columna es NOT NULL, entonces usará automáticamente el valor predeterminado
    para todos los registros existentes, ya sea que especifique WITH VALUESo no.

Cómo funcionan las inserciones con una restricción predeterminada:
si inserta un registro en SomeTabley no especifica SomeColel valor, entonces la opción predeterminada será 0.
Si inserta un valor de Registro y especificación SomeColcomo NULL(y su columna permite valores nulos),
    la restricción predeterminada no se utilizará y NULLse insertará como valor.

Las notas se basaron en los excelentes comentarios de todos a continuación.
Un agradecimiento especial a:
    @Yatrix, @WalterStabosz, @YahooSerious y @StackMan por sus comentarios.

James Boother
fuente
332
Tenga en cuenta que si la columna es anulable, entonces nulo será el valor utilizado para las filas existentes.
Richard Collette
17
@Thecrocodilehunter La columna anulable significa que puede insertar Null para el valor de las columnas. Si no es una columna anulable, debe insertar algún valor de ese tipo de datos. Entonces, para los registros existentes, se insertará Null en ellos y en los registros nuevos, se insertará su valor predeterminado a menos que se especifique lo contrario. ¿Tener sentido?
Yatrix
41
Me gusta esta respuesta un poco mejor que la de dbugger porque explícitamente nombra la restricción predeterminada. Todavía se crea una restricción predeterminada utilizando la sintaxis de dbugger, excepto que su nombre se genera automáticamente. Saber el nombre exacto es útil al escribir scripts DROP-CREATE.
Walter Stabosz
18
@ Vértigo Eso SÓLO es cierto si la columna lo es NOT NULL. Intente esto: 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;verá 2 valores NULL para la columna b.
ErikE
48
Se usa WITH VALUESpara actualizar las filas anulables existentes. Consulte MSDN : "Si la columna agregada permite valores nulos y WITH VALUESse especifica, el valor predeterminado se almacena en la nueva columna y se agrega a las filas existentes".
Yahoo Serious
1008
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

La inclusión de DEFAULT llena la columna en las filas existentes con el valor predeterminado, por lo que no se infringe la restricción NOT NULL.

dbugger
fuente
13
El problema con esa respuesta es que el valor predeterminado solo es válido para nuevos registros. Los registros existentes seguirán teniendo un valor NULL.
Roee Gavirel
130
Encontrará que ese no es el caso. De lo contrario, se violaría la restricción.
dbugger
35
Las columnas en las filas existentes se rellenan con el valor predeterminado. Una pequeña prueba empírica lo demostrará.
dbugger
80
Solo para aclarar: si se omite "NOT NULL" del comando, el valor de las filas existentes NO se actualizará y seguirá siendo NULL. Si se incluye "NOT NULL" en el comando, el valor de las filas existentes se actualizará para que coincida con el valor predeterminado.
Stack Man
15
Para varias columnas ALTER TABLE table_1 ADD col_1 int NOT NULL DEFAULT (1), col_2 int NULL
aads el
233

Al agregar una columna anulable , WITH VALUESse asegurará de que el valor DEFAULT específico se aplique a las filas existentes:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
phunk_munkie
fuente
13
Este es un punto clave. Es fácil asumir que una columna con una DEFAULTrestricción siempre tendrá un valor, es decir, no será NULL, aunque NOT NULLno se especifique.
Bill Brinkley
66
@tkocmathla uh, no estaba hablando del BITtipo de datos, estaba hablando de esta BIT columna en particular . Mire la respuesta, la columna se declara como 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
fuente
77
Esto no funcionará si la tabla ya tiene contenido porque la nueva columna "no anulable" se crea antes de la restricción del valor predeterminado
WDuffy
129
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
Evan V
fuente
13
esto agregar nulo! tiene que ser nulo antes
baaroz
55
@baaroz, esto funciona con NOT NULL: ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR (200) NOT NULL DEFAULT 'SNUGGLES'
shaijut
100

Tenga cuidado cuando la columna que está agregando tiene una NOT NULLrestricción, pero no tiene una DEFAULTrestricción (valor). La ALTER TABLEdeclaración fallará en ese caso si la tabla tiene alguna fila. La solución es eliminar la NOT NULLrestricción de la nueva columna o proporcionarle una DEFAULTrestricción.

jalbert
fuente
2
alguna muestra de SQL al respecto?
Kiquenet
98

La versión más básica con solo dos líneas.

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

Utilizar:

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

Si desea agregar varias columnas, puede hacerlo de esta manera, por ejemplo:

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

Utilizar:

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

Referencia: ALTER TABLE (Transact-SQL) (MSDN)

giá vàng
fuente
54

Para agregar una columna a una tabla de base de datos existente con un valor predeterminado, podemos usar:

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

Aquí hay otra forma de agregar una columna a una tabla de base de datos existente con un valor predeterminado.

A continuación se incluye una secuencia de comandos SQL mucho más exhaustiva para agregar una columna con un valor predeterminado, incluida la verificación de si la columna existe antes de agregarla, también se registra la restricción y se descarta si hay una. Este script también nombra la restricción para que podamos tener una buena convención de nomenclatura (me gusta DF_) y si no, SQL nos dará una restricción con un nombre que tiene un número generado aleatoriamente; así que es bueno poder nombrar la restricción también.

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

Estas son dos formas de agregar una columna a una tabla de base de datos existente con un valor predeterminado.

Catto
fuente
52

Puede hacer lo mismo con T-SQL de la siguiente manera.

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

Además, puede usar SQL Server Management Studio también haciendo clic derecho en la tabla en el menú Diseño, estableciendo el valor predeterminado en tabla.

Y además, si desea agregar la misma columna (si no existe) a todas las tablas de la base de datos, use:

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

En SQL Server 2008-R2, voy al modo de diseño, en una base de datos de prueba, y agrego mis dos columnas con el diseñador e hice la configuración con la GUI, y luego el infame Right-Clickda la opción " Generar secuencia de comandos de cambio "!

Bang up abre una pequeña ventana con, lo adivinaste, el script de cambio garantizado al trabajo correctamente formateado. Presiona el botón fácil.

Jack
fuente
48

Alternativamente, puede agregar un valor predeterminado sin tener que nombrar explícitamente la restricción:

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

Si tiene un problema con las restricciones predeterminadas existentes al crear esta restricción, se pueden eliminar de la siguiente manera:

alter table [schema].[tablename] drop constraint [constraintname]
Christo
fuente
1
FYI, nombrando explícitamente la restricción utilizando un esquema de nomenclatura estándar (por ejemplo, "DF_Table_Column"), para facilitar el mantenimiento. De lo contrario, localizar la restricción requiere más trabajo.
Mike Christian el
43

Esto también se puede hacer en la GUI de SSMS. Muestro una fecha predeterminada a continuación, pero el valor predeterminado puede ser el que sea, por supuesto.

  1. Coloque su tabla en la vista de diseño (haga clic con el botón derecho en la tabla en el explorador de objetos-> Diseño)
  2. Agregue una columna a la tabla (o haga clic en la columna que desea actualizar si ya existe)
  3. En Propiedades de la columna a continuación, introduzca (getdate())o abco 0o cualquier valor que desee en Valor predeterminado o vinculante campo como se muestra a continuación:

ingrese la descripción de la imagen aquí

Tony L.
fuente
31

Ejemplo:

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

Ejemplo:

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

Primero cree una tabla con el nombre de estudiante:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Agregue una columna:

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

SELECT * 
FROM STUDENT

Se crea la tabla y se agrega una columna a una tabla existente con un valor predeterminado.

Imagen 1

Laxmi
fuente
19

Esto tiene muchas respuestas, pero siento la necesidad de agregar este método extendido. Esto parece mucho más largo, pero es extremadamente útil si agrega un campo NOT NULL a una tabla con millones de filas en una base de datos activa.

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

Lo que esto hará es agregar la columna como un campo anulable y con el valor predeterminado, actualizar todos los campos al valor predeterminado (o puede asignar valores más significativos), y finalmente cambiará la columna para que NO sea NULL.

La razón de esto es si actualiza una tabla a gran escala y agrega un nuevo campo no nulo que tiene que escribir en cada fila y de este modo bloqueará toda la tabla a medida que agrega la columna y luego escribe todos los valores.

Este método agregará la columna anulable que funciona mucho más rápido por sí misma, luego llena los datos antes de establecer el estado no nulo.

Descubrí que hacer todo en una sola declaración bloqueará una de nuestras tablas más activas durante 4-8 minutos y, a menudo, he interrumpido el proceso. Este método generalmente toma cada parte de unos pocos segundos y provoca un bloqueo mínimo.

Además, si tiene una tabla en el área de miles de millones de filas, puede valer la actualización por lotes de la siguiente manera:

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

    IF @@ROWCOUNT < 1000000
        BREAK;
END
Ste Bov
fuente
18

Prueba esto

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

SQL Server + Modificar tabla + Agregar columna + Valor predeterminado uniqueidentifier

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))
Naveen Desosha
fuente
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
fuente
3
Me gusta el NOT EXISTScheque antes de intentar alterar la tabla. Muy buena solucion. Algunos comentarios adicionales sobre cómo funciona esto lo harían aún más útil.
Michael Gaskill
17
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
codificador salvaje
fuente
Tal vez reemplazar la imagen con el código real? Difícil de copiar y pegar tal cual.
David Faber
66
Esto no agrega ningún valor sobre las respuestas ya existentes de hace años.
nvoigt
14

Agregue una nueva columna a una tabla:

ALTER TABLE [table]
ADD Column1 Datatype

Por ejemplo,

ALTER TABLE [test]
ADD ID Int

Si el usuario desea que se incremente automáticamente, entonces:

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

Esto es para SQL Server:

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

Ejemplo:

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

Si desea agregar restricciones, entonces:

ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
Akhil Singh
fuente
77
Esto no agrega ningún valor sobre las respuestas ya existentes de hace años.
nvoigt
11

Esto se puede hacer con el siguiente código.

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

Pruebe con la siguiente consulta:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

Esto agregará una nueva columna a la tabla.

Anshul Dubey
fuente
66
esta respuesta dada por otro usuario para esta pregunta
janith1024
9
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

Desde esta consulta, puede agregar una columna de entero de tipo de datos con el valor predeterminado 0.

Sandeep Kumar
fuente
9

Bueno, ahora tengo alguna modificación a mi respuesta anterior. He notado que ninguna de las respuestas mencionadas IF NOT EXISTS. Así que voy a proporcionar una nueva solución, ya que me he enfrentado a algunos problemas para alterar la tabla.

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

Aquí TaskSheetestá el nombre de la tabla en particular y IsBilledToClientes la nueva columna que va a insertar y 1el valor predeterminado. Eso significa en la nueva columna cuál será el valor de las filas existentes, por lo tanto, se establecerá automáticamente allí. Sin embargo, puede cambiar lo que desee con respecto al tipo de columna como lo he usado BIT, por lo que puse el valor predeterminado 1.

Sugiero el sistema anterior, porque me he enfrentado a un problema. Entonces, ¿cuál es el problema? El problema es que si la IsBilledToClientcolumna existe en la tabla de la tabla, entonces si ejecuta solo la parte del código que figura a continuación, verá un error en el generador de consultas del servidor SQL. Pero si no existe, por primera vez no habrá ningún error al ejecutar.

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