Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Noções básicas sobre a instrução ALTER TABLE ADD COLUMN do SQL Server


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:
  1. Adicione várias colunas.
  2. Adicione uma nova coluna de chave primária.
  3. Adicione uma nova coluna de chave estrangeira.
  4. Adicione novas colunas que tenham colunas computadas.
  5. 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:
  1. Você precisa especificar o nome da tabela onde você deseja adicionar uma coluna depois ALTER TABELA .
  2. O nome da coluna ou colunas deve ser após ADD . Para várias colunas, separe seus nomes com vírgulas.
  3. Especifique os tipos de dados da coluna após o nome da coluna .
  4. 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:
  1. Nome antigo: tblCidadeNovo nome: tblCity_Old.
  2. Nome antigo: tblCity_TempNovo 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