Adicionar uma coluna com um valor padrão a uma tabela existente no SQL Server

Respostas:

3498

Sintaxe:

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

Exemplo:

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:

Nome de restrição opcional:
se você deixar de fora CONSTRAINT D_SomeTable_SomeCol, o SQL Server gerará automaticamente
    um Contraint padrão com um nome engraçado, como:DF__SomeTa__SomeC__4FB7FEF6

Opcional Declaração com valores:
A WITH VALUESsó é necessária quando sua coluna é anulável
    e você quer o Valor padrão usado para existente Records.
Se sua coluna for NOT NULL, ela usará automaticamente o Valor padrão
    para todos os registros existentes, independentemente de você especificar WITH VALUESou não.

Como as inserções funcionam com uma restrição padrão:
se você inserir um registro SomeTablee não especificar SomeColo valor de Especificar , será padrão para 0.
Se você inserir um valor de Registro e Especificar SomeColcomo NULL(e sua coluna permitir nulos),
    a restrição padrão não será usada e NULLserá inserida como o valor.

As notas foram baseadas no excelente feedback de todos abaixo.
Agradecimentos especiais a:
    @Yatrix, @WalterStabosz, @YahooSerious e @StackMan por seus comentários.

James Boother
fonte
332
Lembre-se de que, se a coluna for anulável, nulo será o valor usado para as linhas existentes.
Richard Collette
17
A coluna @Thecrocodilehunter Nullable significa que você pode inserir Null para o valor das colunas. Se não for uma coluna anulável, você precisará inserir algum valor desse tipo de dados. Portanto, para registros existentes, Nulo será inserido neles e em novos registros, seu valor padrão será inserido, a menos que seja especificado de outra forma. Faz sentido?
Yatrix
41
Eu gosto desta resposta um pouco melhor do que a do dbugger porque ela nomeia explicitamente a restrição padrão. Uma restrição padrão ainda é criada usando a sintaxe do dbugger, exceto que o nome é gerado automaticamente. Saber o nome exato é útil ao escrever scripts DROP-CREATE.
Walter Stabosz 23/03
18
@Vertigo Isso é verdade apenas se a coluna for NOT NULL. Por favor, tente o seguinte: 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;Você verá 2 valores NULL para a coluna b.
ErikE
48
Use WITH VALUESpara atualizar linhas anuláveis ​​existentes. Consulte MSDN : "Se a coluna adicionada permitir valores nulos e WITH VALUESfor especificada, o valor padrão será armazenado na nova coluna, adicionada às linhas existentes".
Yahoo Serious
1008
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

A inclusão de PADRÃO preenche a coluna nas linhas existentes com o valor padrão, portanto, a restrição NOT NULL não é violada.

dbugger
fonte
13
O problema com essa resposta é que o valor padrão é válido apenas para novos registros. Os registros existentes ainda terão valor NULL.
Roee Gavirel
130
Você verá que não é esse o caso. Caso contrário, a restrição seria violada.
dbugger
35
As colunas nas linhas existentes são preenchidas com o valor padrão. Um pequeno teste empírico provará isso.
dbugger
80
Apenas para esclarecer - se "NOT NULL" for omitido do comando, o valor para as linhas existentes NÃO será atualizado e permanecerá NULL. Se "NOT NULL" estiver incluído no comando, o valor para as linhas existentes SERÁ atualizado para corresponder ao padrão.
Homem Stack
15
Para várias colunas ALTER TABLE table_1 ADD col_1 int NOT NULL DEFAULT (1), col_2 int NULL
aads
233

Ao adicionar uma coluna anulável , WITH VALUESgarantirá que o valor DEFAULT específico seja aplicado às linhas existentes:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
phunk_munkie
fonte
13
Este é um ponto chave. É fácil assumir que uma coluna com DEFAULTrestrição sempre terá um valor - ou seja, não será NULL, mesmo que NOT NULLnão esteja especificada.
Bill Brinkley
6
@tkocmathla uh, eu não estava falando sobre o BITtipo de dados, estava falando sobre essa BIT coluna em particular . Veja a resposta, a coluna é declarada 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
fonte
7
Isso não vai funcionar se a tabela já tem conteúdo porque a coluna nova "não anulável" é criado antes o valor padrão de restrição
WDuffy
129
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'
Evan V
fonte
13
! este complemento nulo tem que ser não nulo antes
baaroz
5
@baaroz, isso funciona com NOT NULL: ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR (200) NOT NULL 'SNUGGLES' PADRÃO '#
shaijut
100

Cuidado quando a coluna que você está adicionando possui uma NOT NULLrestrição, mas ainda não possui uma DEFAULTrestrição (valor). A ALTER TABLEinstrução falhará nesse caso, se a tabela tiver alguma linha nela. A solução é remover a NOT NULLrestrição da nova coluna ou fornecer uma DEFAULTrestrição para ela.

jalbert
fonte
2
alguma amostra SQL sobre isso?
Kiquenet
98

A versão mais básica com apenas duas linhas

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

Usar:

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

Se você deseja adicionar várias colunas, pode fazê-lo desta maneira, por exemplo:

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

Usar:

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

Referência: ALTER TABLE (Transact-SQL) (MSDN)

gia Vang
fonte
54

Para adicionar uma coluna a uma tabela de banco de dados existente com um valor padrão, podemos usar:

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

Aqui está outra maneira de adicionar uma coluna a uma tabela de banco de dados existente com um valor padrão.

Um script SQL muito mais completo para adicionar uma coluna com um valor padrão está abaixo, incluindo verificar se a coluna existe antes de adicioná-la e também verificar a restrição e descartá-la, se houver uma. Esse script também nomeia a restrição para que possamos ter uma boa convenção de nomenclatura (eu gosto de DF_) e, caso contrário, o SQL nos fornecerá uma restrição com um nome que tenha um número gerado aleatoriamente; portanto, é bom poder nomear a restrição também.

-------------------------------------------------------------------------
-- 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 são duas maneiras de adicionar uma coluna a uma tabela de banco de dados existente com um valor padrão.

Catto
fonte
52

Você pode fazer o que quiser com o T-SQL da seguinte maneira.

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

Além disso, você também pode usar o SQL Server Management Studio clicando com o botão direito do mouse na tabela no menu Design, definindo o valor padrão como tabela.

Além disso, se você deseja adicionar a mesma coluna (se não existir) a todas as tabelas no banco de dados, use:

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

No SQL Server 2008-R2, vou para o modo de design - em um banco de dados de teste - e adiciono minhas duas colunas usando o designer e defini as configurações com a GUI e, em seguida, o infame Right-Clickfornece a opção " Gerar script de alteração "!

Bang up aparece uma pequena janela com, você adivinhou, o script de alteração garantido para o trabalho formatado corretamente. Aperte o botão fácil.

Jack
fonte
48

Como alternativa, você pode adicionar um padrão sem precisar nomear explicitamente a restrição:

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

Se você tiver um problema com as restrições padrão existentes ao criar essa restrição, elas poderão ser removidas por:

alter table [schema].[tablename] drop constraint [constraintname]
Christo
fonte
1
Para sua informação, nomeando explicitamente a restrição usando um esquema de nomeação padrão (por exemplo, "DF_Table_Column"), para facilitar a manutenção. Caso contrário, a localização da restrição requer mais trabalho.
9788 Mike Orlandi
43

Isso também pode ser feito na GUI do SSMS. Eu mostro uma data padrão abaixo, mas o valor padrão pode ser o que for, é claro.

  1. Coloque sua tabela no modo de design (clique com o botão direito do mouse na tabela no explorador de objetos-> Design)
  2. Adicione uma coluna à tabela (ou clique na coluna que deseja atualizar, se ela já existir)
  3. Nas Propriedades da coluna abaixo, insira (getdate())ou abcou 0o valor que você deseja no campo Valor padrão ou Ligação , conforme mostrado abaixo:

insira a descrição da imagem aqui

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

O artigo do MSDN ALTER TABLE (Transact-SQL) possui toda a sintaxe da tabela de alteração.

Benjamin Autin
fonte
31

Exemplo:

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

Exemplo:

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

Primeiro, crie uma tabela com o nome student:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Adicione uma coluna a ela:

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

SELECT * 
FROM STUDENT

A tabela é criada e uma coluna é adicionada a uma tabela existente com um valor padrão.

Imagem 1

Laxmi
fonte
19

Isso tem muitas respostas, mas sinto a necessidade de adicionar esse método estendido. Isso parece muito mais longo, mas é extremamente útil se você estiver adicionando um campo NOT NULL a uma tabela com milhões de linhas em um banco de dados ativo.

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

O que isso fará é adicionar a coluna como um campo anulável e com o valor padrão, atualizar todos os campos para o valor padrão (ou você pode atribuir valores mais significativos) e, finalmente, ela mudará a coluna para NÃO NULL.

A razão para isso é que, se você atualizar uma tabela de grande escala e adicionar um novo campo não nulo, ele deverá ser gravado em todas as linhas e, dessa forma, bloqueará a tabela inteira à medida que adiciona a coluna e, em seguida, grava todos os valores.

Este método adicionará a coluna anulável, que opera muito mais rapidamente, e preenche os dados antes de definir o status não nulo.

Descobri que fazer a coisa toda em uma instrução bloqueará uma de nossas tabelas mais ativas por 4-8 minutos e, muitas vezes, eu acabei com o processo. Esse método de cada parte geralmente leva apenas alguns segundos e causa um bloqueio mínimo.

Além disso, se você tiver uma tabela na área de bilhões de linhas, poderá valer a atualização em lotes da seguinte maneira:

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

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

Tente isto

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

SQL Server + Alterar tabela + Adicionar coluna + Valor padrão uniqueidentifier

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))
Naveen Desosha
fonte
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
fonte
3
Gosto da NOT EXISTSverificação antes de tentar alterar a tabela. Solução muito boa. Alguns comentários adicionais sobre como isso funciona tornariam ainda mais úteis.
Michael Gaskill
17
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
codificador selvagem
fonte
Talvez substitua a imagem pelo código real? Difícil de copiar e colar como está.
David Faber
6
Isso não agrega valor às respostas já existentes de anos atrás.
Nvoigt 15/0418
14

Adicione uma nova coluna a uma tabela:

ALTER TABLE [table]
ADD Column1 Datatype

Por exemplo,

ALTER TABLE [test]
ADD ID Int

Se o usuário quiser incrementá-lo automaticamente, então:

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

Isto é para o SQL Server:

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

Exemplo:

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

Se você deseja adicionar restrições, então:

ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
Akhil Singh
fonte
7
Isso não agrega valor às respostas já existentes de anos atrás.
Nvoigt 15/0418
11

Isso pode ser feito pelo código abaixo.

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

Tente com a consulta abaixo:

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

Isso adicionará uma nova coluna à tabela.

Anshul Dubey
fonte
6
esta resposta dada por outro usuário para esta pergunta
janith1024 28/08
9
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

Nesta consulta, você pode adicionar uma coluna do tipo de dados número inteiro com o valor padrão 0.

Sandeep Kumar
fonte
9

Bem, agora eu tenho algumas modificações na minha resposta anterior. Percebi que nenhuma das respostas mencionadas IF NOT EXISTS. Então, vou fornecer uma nova solução, pois enfrentei alguns problemas ao alterar a tabela.

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

Aqui TaskSheetestá o nome da tabela em particular e IsBilledToClienta nova coluna que você irá inserir e 1o valor padrão. Isso significa na nova coluna qual será o valor das linhas existentes; portanto, uma será definida automaticamente lá. No entanto, você pode alterar como desejar com o respeito do tipo de coluna como eu useiBIT , então coloquei no valor padrão 1.

Sugiro o sistema acima, porque enfrentei um problema. Então qual é o problema? O problema é que, se a IsBilledToClientcoluna existir na tabela, se você executar apenas a parte do código fornecida abaixo, verá um erro no construtor Query do SQL Server. Mas se ele não existir, pela primeira vez, não haverá erro ao executar.

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