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

¿Cómo puedo agregar una columna con un valor predeterminado a una tabla existente en SQL Server 2000 / SQL Server 2005?

preguntado el 18 de septiembre de 08 a las 13:09

30 Respuestas

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 dejas fuera CONSTRAINT D_SomeTable_SomeCol entonces SQL Server se autogenerará
    un Default-Contraint con un nombre divertido como: DF__SomeTa__SomeC__4FB7FEF6

Declaración opcional con valores:
El WITH VALUES solo es necesario cuando su columna es anulable
    y desea que se utilice el valor predeterminado para los registros existentes.
Si su columna es NOT NULL, luego usará automáticamente el valor predeterminado
    para todos los registros existentes, ya sea que especifique WITH VALUES o no.

Cómo funcionan las inserciones con una restricción predeterminada:
Si inserta un registro en SomeTable y hacer no Especificar SomeCol, entonces se establecerá por defecto en 0.
Si inserta un registro y Especificar SomeColvalor como NULL (y su columna permite nulos),
    entonces la Restricción predeterminada no ser utilizado y NULL se insertará como Valor.

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

Respondido 03 Jul 18, 23:07

Tenga en cuenta que si la columna es anulable, entonces nulo será el valor utilizado para las filas existentes. - Richard Collette

@Thecrocodilehunter La columna que acepta valores NULL 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. Por lo tanto, 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

Me gusta esta respuesta un poco más que la de dbugger porque nombra explícitamente la restricción predeterminada. Aún 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

@Vertigo Eso es SÓLO cierto si la columna es NOT NULL. Por favor 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

Utilizan WITH VALUES para actualizar las filas que aceptan valores NULL existentes. Ver MSDN: "Si la columna agregada permite valores nulos y WITH VALUES se especifica, el valor predeterminado se almacena en la nueva columna y se agrega a las filas existentes. "- Yahoo Serious

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

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

Respondido 19 Abr '16, 16:04

El problema con esa respuesta es que el valor predeterminado solo es válido para registros nuevos. Los registros existentes seguirán teniendo un valor NULL. - Roee Gavirel

Descubrirás que ese no es el caso. De lo contrario, se violaría la restricción. - dbugger

Las columnas de las filas existentes se rellenan con el valor predeterminado. Una pequeña prueba empírica lo probará. - dbugger

Solo para aclarar: si se omite "NOT NULL" en el 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 predeterminado. - Hombre de pila

Para varias columnas ALTER TABLE table_1 ADD col_1 int NOT NULL DEFAULT (1), col_2 int NULL - aads

Al agregar un columna que acepta valores NULL, WITH VALUES se asegurará de que el valor predeterminado 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

contestado el 26 de mayo de 17 a las 22:05

Este es un punto clave. Es fácil asumir una columna con un DEFAULT La restricción siempre tendrá un valor, es decir, no será NULL, aunque NOT NULL no se especifica. - Bill Brinkley

@tkocmathla uh, no estaba hablando de la BIT tipo de datos, estaba hablando de este BIT visión de conjunto. Mira la respuesta, la columna se declara como NOT NULL. - rsenna

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

Respondido 31 Jul 09, 07:07

Esto no funcionará si la tabla ya tiene contenido porque la nueva columna "no anulable" se crea antes de la restricción de valor predeterminado - WDuffy

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

respondido 17 nov., 12:03

este add null! no tiene que ser nulo antes - baaroz

@baaroz, esto funciona con NOT NULL: ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR (200) NOT NULL DEFAULT 'SNUGGLES' - Shaiju T

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

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

contestado el 25 de mayo de 12 a las 18:05

Tenga cuidado cuando la columna que está agregando tenga un NOT NULL restricción, pero no tiene una DEFAULT restricción (valor). La ALTER TABLE En ese caso, la instrucción fallará si la tabla tiene filas. La solución es eliminar el NOT NULL restricción de la nueva columna, o proporcionar una DEFAULT restricción para ello.

Respondido el 24 de Septiembre de 08 a las 20:09

cualquier Muestra de SQL sobre eso? - Kiquenet

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 

Respondido 27 Feb 20, 11:02

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

respondido 14 nov., 17:23

Uso:

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

Referencia: ALTERAR TABLA (Transact-SQL) (MSDN)

contestado el 26 de mayo de 17 a las 22:05

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 muestra un script SQL mucho más completo para agregar una columna con un valor predeterminado, que incluye verificar si la columna existe antes de agregarla, también verifique la restricción y elimínela si la hay. 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.

respondido 29 nov., 17:22

Puede hacerlo con T-SQL de la siguiente manera.

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

Tan bien como puedes usar SQL Server Management Studio también haciendo clic con el botón 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 en la base de datos, use:

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

contestado el 26 de mayo de 17 a las 22:05

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

Bang up abre una pequeña ventana con, lo has adivinado, el script de cambio garantizado para que funcione correctamente formateado. Pulsa el botón fácil.

contestado el 26 de mayo de 17 a las 22:05

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, puede eliminarlas de la siguiente manera:

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

contestado el 26 de mayo de 17 a las 22:05

FYI, nombrar explícitamente la restricción usando 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

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

  1. Ponga su tabla en la vista de diseño (haga clic 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 columna a continuación, ingrese (getdate()) or 'abc' or 0 o cualquier valor que quieras en Valor predeterminado o enlace campo como se muestra a continuación:

enter image description here

Respondido el 24 de junio de 20 a las 20:06

ALTER TABLE ADD ColumnName {Column_Type} Constraint

El artículo de MSDN ALTERAR TABLA (Transact-SQL) tiene toda la sintaxis de la tabla alter.

Respondido 30 Jul 13, 01:07

Ejemplo:

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

Respondido 12 Jul 14, 10:07

Ejemplo:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';

Respondido 15 Abr '15, 08:04

Primero crea una tabla con el nombre del alumno:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Agrégale 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.

1 imagen

contestado el 29 de mayo de 17 a las 11:05

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 está agregando 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 que acepta valores NULL 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 sea NO NULA.

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

Este método agregará la columna anulable que opera 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 declaración bloqueará una de nuestras tablas más activas durante 4-8 minutos y, con bastante frecuencia, elimino el proceso. Este método para cada parte generalmente toma solo unos segundos y causa un bloqueo mínimo.

Además, si tiene una tabla en el área de miles de millones de filas, puede valer la pena agrupar la actualización de esta manera:

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

    IF @@ROWCOUNT < 1000000
        BREAK;
END

contestado el 26 de mayo de 17 a las 22:05

Prueba esta

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

Respondido el 01 de Septiembre de 14 a las 11:09

SQL Server + Modificar tabla + Agregar columna + Valor predeterminado identificador único

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

Respondido 07 Jul 15, 11:07

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

Respondido el 21 de junio de 16 a las 14:06

me gusta el NOT EXISTS compruebe antes de intentar alterar la tabla. Muy buena solucion. Algún comentario adicional sobre cómo funciona esto lo haría aún más útil. - Michael Gaskill

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

respondido 27 mar '18, 10:03

¿Quizás reemplazar la imagen con el código real? Difícil de copiar y pegar como está. - David Faber

Esto no agrega ningún valor a las respuestas ya existentes de hace años. - nvoigt

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

Respondido el 30 de Septiembre de 18 a las 18:09

Esto no agrega ningún valor a las respuestas ya existentes de hace años. - nvoigt

Agregue una nueva columna a una tabla:

ALTER TABLE [table]
ADD Column1 Datatype

Por ejemplo,

ALTER TABLE [test]
ADD ID Int

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

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

contestado el 26 de mayo de 17 a las 22:05

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

contestado el 26 de mayo de 17 a las 22:05

Pruebe con la siguiente consulta:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

Esto agregará una nueva columna a la tabla.

Respondido el 30 de Septiembre de 18 a las 18:09

esta respuesta dada por otro usuario para esta pregunta - janith1024

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

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

contestado el 24 de mayo de 16 a las 14:05

Bueno, ahora tengo algunas modificaciones a mi respuesta anterior. He notado que ninguna de las respuestas mencionada IF NOT EXISTS. Así que voy a proporcionar una nueva solución ya que me he enfrentado a algunos problemas al 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í TaskSheet es el nombre de la tabla particular y IsBilledToClient es la nueva columna que va a insertar y 1 el valor predeterminado. Eso significa en la nueva columna cuál será el valor de las filas existentes, por lo tanto, se establecerá una automáticamente allí. Sin embargo, puede cambiar como desee respetando el tipo de columna que he usado BIT, así 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, si el IsBilledToClient Si la columna existe en la tabla de la tabla, si ejecuta solo la parte del código que se proporciona a continuación, verá un error en el generador de consultas del servidor SQL. Pero si no existe entonces por primera vez no habrá error al ejecutar.

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

contestado el 26 de mayo de 17 a las 22:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.