Adicionar uma coluna com um valor padrão a uma tabela existente no SQL Server
-
01-07-2019 - |
Pergunta
Como pode uma coluna com um valor padrão ser adicionado a uma tabela existente em SQL Server 2000 / SQL Server 2005 ?
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.
- Coloque sua tabela no modo de design (Botão direito do mouse sobre a mesa em objeto Explorer-> Projeto)
- Adicione uma coluna à tabela (ou clique na coluna que deseja atualização se ele já existir)
- Em Propriedades da coluna abaixo, insira
(getdate())
ouabc
ou0
ou qualquer valor que você quer em Valor padrão ou campo Encadernação como na figura abaixo:
Exemplo:
ALTER TABLE [Employees] ADD Seniority int not null default 0 GO
Exemplo:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
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