Este artigo descreve a instrução ALTER TABLE ADD COLUMN do SQL Server. O objetivo desta instrução é adicionar uma nova coluna a uma tabela existente. Além disso, o artigo esclarecerá os seguintes casos de uso:
- Adicione várias colunas.
- Adicione uma nova coluna de chave primária.
- Adicione uma nova coluna de chave estrangeira.
- Adicione novas colunas que tenham colunas computadas.
- Adicione uma nova coluna com restrições CHECK e UNIQUE.
Especificidade de sintaxe da instrução SQL ALTER TABLE ADD COLUMN
Como vamos explorar a instrução completamente, vamos começar entendendo a sintaxe:
Alter table [table_name] add column [column_name] [data_type][constraint]
Observe os seguintes aspectos:
- Você precisa especificar o nome da tabela onde você deseja adicionar uma coluna depois ALTER TABELA .
- O nome da coluna ou colunas deve ser após ADD . Para várias colunas, separe seus nomes com vírgulas.
- Especifique os tipos de dados da coluna após o nome da coluna .
- Se você estiver adicionando qualquer restrição, uma chave primária ou uma chave estrangeira , especifique-o após o tipo de dados .
Para fins de demonstração, criei um banco de dados chamado CodingSight . Lá, criei três tabelas chamadas tbldepartment , empregado, e tblCity, e inseriu dados fictícios nessas tabelas.
O script a seguir cria um banco de dados e tabelas:
USE codingsight
GO
CREATE TABLE tbldepartment(departmentID INT IDENTITY(1,1), departmentname VARCHAR(50),
CONSTRAINT PK_departmentID PRIMARY KEY (departmentID))
GO
CREATE TABLE tblemployee(employeeID INT IDENTITY(1,1), name VARCHAR(50), Address VARCHAR(max), PhoneNumber VARCHAR(10)
CONSTRAINT PK_employeeID PRIMARY KEY (employeeID))
GO
CREATE TABLE tblCity( Name VARCHAR(50), Country VARCHAR(100))
GO
O script abaixo insere os dados fictícios na tabela:
INSERT INTO tbldepartment (departmentname) VALUES ('IT'),('Devlopment Team'),('Human Resource'),('Qualiy Assurance')
GO
INSERT INTO tblemployee (name, address, PhoneNumber) VALUES
('Nisarg Upadhyay','AB14, Akshardham Flats, Mehsana', 1234567890),
('Nirali Upadhyay','AB05, Suyojan Flats, Surat', 1234567890),
('Dixit Upadhyay','B14, Suyash Flats, Vadodara', 1234567890),
('Bharti Upadhyay','C14, Suramya Flats, Ahmedabad', 1234567890),
('Sawan panchal','P18, Kirti Flats, Ahmedabad', 1234567890),
('Raghav Dave','A14, Suramya Flats, Ahmedabad', 1234567890)
GO
INSERT INTO tblCity (name, country)VALUES
('Ahmedabad','India'),
('Surat','India'),
('Vadodara','India'),
('Gandhinagar','India')
Go
Agora, vamos prosseguir para os casos de uso.
Adicionar várias colunas a uma tabela
Em nosso exemplo, queremos adicionar o State e Código PIN colunas para a tbleCity tabela. O tipo de dados do Estado coluna é VARCHAR e o comprimento da coluna é 150. O tipo de dados do Pincode coluna é INTEGER. Para adicionar colunas, execute a seguinte consulta:
ALTER TABLE tblCity ADD State VARCHAR(150), Pincode INT
Agora, execute a consulta para visualizar a lista de colunas do tblCity tabela:
USE CodingSight
go
SELECT c.TABLE_SCHEMA,c.TABLE_NAME,c.COLUMN_NAME,c.DATA_TYPE,c.CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS c WHERE C.TABLE_NAME='tblCity'
A saída da consulta:
Como você pode ver, o Estado e Código PIN colunas foram adicionadas.
Adicionar colunas de chave primária a uma tabela
Vamos adicionar a coluna Chave Primária ao tblCity tabela. De acordo com os requisitos do negócio, devemos adicionar uma coluna com uma combinação de um caractere e um número de quatro dígitos para identificar a cidade.
Estamos adicionando uma nova coluna chamada City_Code para a tblCity tabela. O tipo de dados do City_Code é varchar, e o comprimento é cinco. Execute a seguinte consulta para adicionar uma coluna:
ALTER TABLE tblCity ADD City_Code VARCHAR(5) PRIMARY KEY CLUSTERED
A saída:
Msg 4901, Level 16, State 1, Line 29
ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column.
Alternatively, if none of the previous conditions are satisfied the table must be empty to allow the addition of this column.
Column 'City_Code' cannot be added to non-empty table 'tblCity' because it does not satisfy these conditions.
A consulta retorna um erro porque a chave primária deve ser exclusiva e não nula. Para adicionar uma coluna a esta tabela, devemos seguir os passos abaixo:
Etapa:1
Crie uma nova tabela vazia chamada tblCity_Temp usando a definição da tblCity existente tabela. A nova tabela tem uma coluna de chave primária.
O script de criação é o seguinte:
CREATE TABLE tblCity_Temp( City_code VARCHAR(5) CONSTRAINT PK_City_Code PRIMARY KEY CLUSTERED,
Name VARCHAR(50), Country VARCHAR(100))
GO
Etapa:2
Insira os dados no tblCity_Temp tabela da tblCity tabela:
INSERT INTO tblCity_Temp (City_code,name, country)VALUES
('C0001','Ahmedabad','India'),
('C0002','Surat','India'),
('C0003','Vadodara','India'),
('C0004','Gandhinagar','India')
GO
Etapa:3
Renomeie as tabelas conforme mostrado abaixo:
- Nome antigo: tblCidade – Novo nome: tblCity_Old.
- Nome antigo: tblCity_Temp – Novo nome: tblCidade .
Preste atenção à consulta de renomeação da tabela:
USE codingsight
go
EXEC Sp_rename
'tblCity',
'tblCity_Old'
go
EXEC Sp_rename
'tblCity_Temp',
'tblCity'
go
Agora, execute a seguinte consulta para visualizar a chave primária recém-adicionada:
USE codingsight
go
SELECT Schema_name(tbl.schema_id) AS [schema_name],
primary_key.[name] AS pk_name,
index_columns.index_column_id AS column_id,
TABLE_coumns.[name] AS column_name,
tbl.[name] AS table_name
FROM sys.tables tbl
INNER JOIN sys.indexes primary_key
ON tbl.object_id = primary_key.object_id
AND primary_key.is_primary_key = 1
INNER JOIN sys.index_columns index_columns
ON index_columns.object_id = primary_key.object_id
AND index_columns.index_id = primary_key.index_id
INNER JOIN sys.columns TABLE_coumns
ON primary_key.object_id = TABLE_coumns.object_id
AND TABLE_coumns.column_id = index_columns.column_id
AND tbl.NAME = 'tblCity'
ORDER BY Schema_name(tbl.schema_id),
primary_key.[name],
index_columns.index_column_id
A saída:
Use a consulta para a visualização de dados:
SELECT * FROM tblCity c
A saída:
Adicionar colunas de chave estrangeira a uma tabela
Suponha que queremos adicionar uma coluna chamada deptID para o tblEmployee tabela. O tipo de dados da coluna é INTEGER. Ele faz referência ao departmentID coluna do tbldepartment tabela.
A consulta é a seguinte:
ALTER TABLE tblEmployee ADD deptID INTEGER,CONSTRAINT FK_DepartmentID FOREIGN KEY(deptID) REFERENCES tbldepartment(departmentID)
Execute a próxima consulta para visualizar a nova coluna de chave estrangeira:
USE codingsight
go
SELECT Schema_name(tbl.schema_id) + '.' + tbl.NAME AS foreign_table,
Schema_name(primarykey_tab.schema_id) + '.'
+ primarykey_tab.NAME AS primary_table,
Substring(column_names, 1, Len(column_names) - 1) AS [fk_columns],
foreignkeys.NAME AS fk_constraint_name
FROM sys.foreign_keys foreignkeys
INNER JOIN sys.tables tbl
ON tbl.object_id = foreignkeys.parent_object_id
INNER JOIN sys.tables primarykey_tab
ON primarykey_tab.object_id = foreignkeys.referenced_object_id
CROSS apply (SELECT col.[name] + ', '
FROM sys.foreign_key_columns fk_columns
INNER JOIN sys.columns col
ON fk_columns.parent_object_id =
col.object_id
AND fk_columns.parent_column_id =
col.column_id
WHERE fk_columns.parent_object_id = tbl.object_id
AND fk_columns.constraint_object_id =
foreignkeys.object_id
ORDER BY col.column_id
FOR xml path ('')) D (column_names)
ORDER BY Schema_name(tbl.schema_id) + '.' + tbl.NAME,
Schema_name(primarykey_tab.schema_id) + '.'
+ primarykey_tab.NAME
A saída:
Observe o diagrama ER:
Dessa forma, criamos uma chave estrangeira chamada FK_DepartmentID .
Adicione uma coluna com restrição CHECK e DEFAULT
Agora, vamos adicionar uma coluna chamada minimum_wages ao tblemployee tabela. O tipo de dados da coluna é dinheiro .
O salário_mínimo o valor da coluna deve ser maior ou igual a 5,60$. Portanto, criamos o cheque condição para verificar o valor inserido – deve ser superior a 5,60$. Além disso, o valor padrão da coluna é 5,60$.
Para adicionar a coluna, execute a seguinte consulta:
USE codingsight
go
ALTER TABLE tblemployee
ADD minimum_wages MONEY CONSTRAINT chk_minimum_wages CHECK (minimum_wages>=5.6)
CONSTRAINT df_minimum_wages DEFAULT 5.6;
Next, we run the UPDATE query to change the values:
UPDATE tblemployee SET minimum_wages=5.5 WHERE employeeID =5;
Ocorre o seguinte erro:
Msg 547, Level 16, State 0, Line 78
The UPDATE statement conflicted with the CHECK constraint "CHK_minimum_wages".
The conflict occurred in database "CodingSight", table "dbo.tblemployee", column 'minimum_wages'.
O valor especificado para o minimum_wages coluna é inferior a 5,6. É por isso que a consulta retornou um erro.
Altere o valor de minimum_wages value e execute a consulta novamente:
UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;
A saída:
(1 row affected)
Completion time: 2020-12-14T17:22:40.8995851+05:30
Depois de atualizar o registro, execute a consulta abaixo para visualizar os dados:
Select * from tblemployee where employeeID=5
A saída:
Para verificar se a restrição padrão está funcionando, execute a seguinte instrução INSERT:
USE codingsight
GO
INSERT INTO tblemployee (name, Address, PhoneNumber,deptID) VALUES ('Dilip Patel','Satyamev Famosa, Gandhinagar','9537021112',1)
Uma vez inserido o registro, vamos visualizar os dados:
A consulta:
USE CodingSight
go
SELECT * FROM tblemployee t WHERE t.employeeID=25
A saída:
Não especifiquei o valor do minimum_wages coluna. Assim, o valor padrão é inserido na tabela.
Resumo
O artigo esclareceu a essência da instrução ALTER TABLE ADD COLUMN, sua sintaxe e vários casos de uso de implementações.
Leia também
Noções básicas da instrução ALTER TABLE do SQL Server
Entendendo a coluna SQL DELETE da tabela
Compreendendo a instrução SQL DROP TABLE IF EXISTS