Como posso adicionar uma coluna com um valor padrão a uma tabela existente no SQL Server 2000 / SQL Server 2005 ?
Como posso adicionar uma coluna com um valor padrão a uma tabela existente no SQL Server 2000 / SQL Server 2005 ?
Respostas:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES
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.
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 VALUES
só é 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 VALUES
ou não.
Como as inserções funcionam com uma restrição padrão:
se você inserir um registro SomeTable
e não especificar SomeCol
o valor de Especificar , será padrão para 0
.
Se você inserir um valor de Registro e Especificar SomeCol
como NULL
(e sua coluna permitir nulos),
a restrição padrão não será usada e NULL
será 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.
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
.
WITH VALUES
para atualizar linhas anuláveis existentes. Consulte MSDN : "Se a coluna adicionada permitir valores nulos e WITH VALUES
for especificada, o valor padrão será armazenado na nova coluna, adicionada às linhas existentes".
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.
Ao adicionar uma coluna anulável , WITH VALUES
garantirá 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
DEFAULT
restrição sempre terá um valor - ou seja, não será NULL, mesmo que NOT NULL
não esteja especificada.
BIT
tipo de dados, estava falando sobre essa BIT
coluna em particular . Veja a resposta, a coluna é declarada como NOT NULL
.
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
Cuidado quando a coluna que você está adicionando possui uma NOT NULL
restrição, mas ainda não possui uma DEFAULT
restrição (valor). A ALTER TABLE
instrução falhará nesse caso, se a tabela tiver alguma linha nela. A solução é remover a NOT NULL
restrição da nova coluna ou fornecer uma DEFAULT
restrição para ela.
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
Usar:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
Referência: ALTER TABLE (Transact-SQL) (MSDN)
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.
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();''' ;
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.
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]
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.
(getdate())
ou abc
ou 0
o valor que você deseja no campo Valor padrão ou Ligação , conforme mostrado abaixo:ALTER TABLE ADD ColumnName {Column_Type} Constraint
O artigo do MSDN ALTER TABLE (Transact-SQL) possui toda a sintaxe da tabela de alteração.
Exemplo:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
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.
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
Tente isto
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
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))
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
NOT EXISTS
verificação antes de tentar alterar a tabela. Solução muito boa. Alguns comentários adicionais sobre como isso funciona tornariam ainda mais úteis.
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
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
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
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
Tente com a consulta abaixo:
ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
Isso adicionará uma nova coluna à tabela.
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.
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 TaskSheet
está o nome da tabela em particular e IsBilledToClient
a nova coluna que você irá inserir e 1
o 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 IsBilledToClient
coluna 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]