Pergunta

Como pode uma coluna com um valor padrão ser adicionado a uma tabela existente em SQL Server 2000 / SQL Server 2005 ?

Foi útil?

Solução

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:

Opcional Restrição Nome:
Se você deixar de fora CONSTRAINT D_SomeTable_SomeCol seguida, SQL Server irá gerar automaticamente
um Default-contraint com um nome engraçado como: DF__SomeTa__SomeC__4FB7FEF6

Opcional Declaração com valores:
O WITH VALUES só é necessária quando sua coluna é anulável
e você quer que o padrão Valor usado para existente Records.
Se sua coluna é NOT NULL, então ele usará automaticamente o valor padrão
para todos existente Records, se você especificar WITH VALUES ou não.

Como trabalho Inserções com um padrão-Restrição:
Se você inserir um registro em SomeTable e fazer não Especifique o valor da SomeCol, em seguida, ele será o padrão para 0.
Se você inserir um registro e Especifique o valor da SomeCol como NULL (e sua coluna permite valores nulos),
em seguida, o Default-Restrição não ser usado e NULL será inserido como Valor.

Notas foram baseados em grande feedback de todos abaixo.
Agradecimentos especiais a:
@Yatrix, @WalterStabosz, @YahooSerious e @StackMan para os seus comentários.

Outras dicas

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

A inclusão do Padrão enche a coluna existentes linhas com o valor padrão, então a restrição NOT NULL não é violada.

Ao adicionar um coluna anulável , WITH VALUES irá garantir que o valor específico padrão é aplicado a linhas existentes:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
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
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'

Tenha cuidado quando a coluna que você está adicionando tem uma restrição NOT NULL, ainda não tem uma restrição DEFAULT (valor). A declaração ALTER TABLE irá falhar nesse caso, se a tabela tem quaisquer linhas nele. A solução é para remover tanto o constrangimento NOT NULL a partir da nova coluna, ou proporcionar uma restrição DEFAULT para ele.

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

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

Use:

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

ALTER TABLE myTableName  
ADD RecordAddedDate smalldatetime NULL DEFAULT(GetDate())  
GO 

Se você quiser adicionar várias colunas que você pode fazê-lo desta forma, por exemplo:

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

Use:

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

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

Você pode fazer a coisa com T-SQL da seguinte forma.

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

Assim como você pode usar SQL Server Management Studio também pela tabela botão direito do mouse no projeto de menu, definindo o valor padrão para a tabela.

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

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

No SQL Server 2008 R2, que eu vá para o modo de design - em um banco de dados de teste - e adicionar meus dois colunas usando o designer e fez os ajustes com a GUI, e depois o infame botão direito do mouse dá a opção " Gerar Mudança Script "!

bang até aparece uma pequena janela com, você adivinhou, o script de alteração garantida ao trabalho formatado corretamente. Aperte o botão fácil.

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

Um script muito mais completa do SQL para adicionar uma coluna com um valor padrão está abaixo incluindo a verificação se a coluna existe antes de adicionar também checkin a restrição e soltando-se houver um. Este script também nomes a restrição para que possamos ter uma convenção agradável de nomeação (I como DF_) e se não for SQL nos dará uma restrição com um nome que tem um número gerado aleatoriamente; Portanto, é bom ser capaz de 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.

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

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

Se você tem um problema com restrições padrão existente ao criar essa restrição, em seguida, eles podem ser removidos por:

alter table [schema].[tablename] drop constraint [constraintname]
ALTER TABLE ADD ColumnName {Column_Type} Constraint

O artigo MSDN ALTER TABLE (Transact-SQL) tem toda a sintaxe ALTER TABLE.

Isto pode ser feito no SSMS GUI também. Eu mostrar uma data padrão abaixo, mas o valor padrão pode ser o que, é claro.

  1. Coloque sua tabela no modo de design (Botão direito do mouse sobre a mesa em objeto Explorer-> Projeto)
  2. Adicione uma coluna à tabela (ou clique na coluna que deseja atualização se ele já existir)
  3. Em Propriedades da coluna abaixo, insira (getdate()) ou abc ou 0 ou qualquer valor que você quer em Valor padrão ou campo Encadernação como na figura abaixo:

 enter descrição da imagem aqui

Exemplo:

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

Exemplo:

ALTER TABLE tes 
ADD ssd  NUMBER   DEFAULT '0';

Primeiro criar uma tabela com o aluno Nome:

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

Adicionar uma coluna para ele:

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

SQL Server + Alter Table + Adicionar coluna + Valor padrão uniqueidentifier

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))
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

Tente este

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

Isto tem um monte de respostas, mas eu sinto a necessidade de adicionar este método estendida. Isso parece muito mais tempo, mas é extremamente útil se você está 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 isto vai fazer é adicionar a coluna como um campo nulo e com o valor padrão, atualizar todos os campos para o valor padrão (ou você pode atribuir valores mais significativos) e, finalmente, ele vai mudar a coluna para ser NOT NULL.

A razão para isto é que se você atualizar uma tabela grande escala e adicionar um novo campo não nulo tem de escrever para cada linha e aqui vai bloquear toda a tabela, uma vez que adiciona a coluna e, em seguida, grava todos os valores.

Este método irá adicionar a coluna anulável que opera muito mais rápido, por si só, em seguida, preenche os dados antes de definir o status não nulo.

Descobri que fazendo a coisa inteira em uma instrução for bloquear uma das nossas mesas mais ativos durante 4-8 minutos, e muitas vezes eu matei o processo. Este método cada parte geralmente leva apenas alguns segundos e provoca bloqueio mínimo.

Além disso, se você tem uma tabela na área de bilhões de linhas pode valer a pena lotes a atualização assim:

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

    IF @@ROWCOUNT < 1000000
        BREAK;
END

Adicionar uma nova coluna a uma tabela:

ALTER TABLE [table]
ADD Column1 Datatype

Por exemplo,

ALTER TABLE [test]
ADD ID Int

Se o usuário quer torná-lo auto incrementado em seguida:

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

Isto 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
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

A partir desta consulta, você pode adicionar uma coluna do tipo de dados inteiro com valor padrão 0.

Esta é 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ê quiser adicionar restrições então:

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

Bem, agora tenho algumas modificações para a minha resposta anterior. Tenho notado que nenhuma das respostas mencionado IF NOT EXISTS. Então, eu estou indo para fornecer uma nova solução nele como tenho enfrentado alguns problemas alterando 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 TaskSheet é o nome da tabela particular e IsBilledToClient é a nova coluna que você está indo para inserir e 1 o valor padrão. Isso significa que na nova coluna de qual será o valor das linhas existentes, portanto, um será definido automaticamente lá. No entanto, você pode alterar como você deseja com o respeito do tipo de coluna como eu tenho BIT usado, então eu coloquei no valor padrão 1.

Eu sugiro que o sistema acima, porque eu ter enfrentado um problema. Então qual é o problema? O problema é, se a coluna IsBilledToClient faz existe na tabela de mesa, em seguida, se você executar apenas a parte do código dado abaixo, você verá um erro no servidor SQL Query Builder. Mas se ele não existir, em seguida, pela primeira vez, não haverá nenhum erro durante a execução.

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

SQL Server + Alter Table + Adicionar coluna + Valor padrão uniqueidentifier ...

ALTER TABLE [TABLENAME] ADD MyNewColumn INT not null default 0 GO
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top