In questo articolo viene descritta l'istruzione ALTER TABLE ADD COLUMN di SQL Server. Lo scopo di questa istruzione è aggiungere una nuova colonna a una tabella esistente. Inoltre, l'articolo chiarirà i seguenti casi d'uso:
- Aggiungi più colonne.
- Aggiungi una nuova colonna di chiave primaria.
- Aggiungi una nuova colonna di chiave esterna.
- Aggiungi nuove colonne con colonne calcolate.
- Aggiungi una nuova colonna con vincoli CHECK e UNIQUE.
La specificità della sintassi dell'istruzione SQL ALTER TABLE ADD COLUMN
Mentre esploreremo a fondo l'affermazione, iniziamo con la comprensione della sintassi:
Alter table [table_name] add column [column_name] [data_type][constraint]
Nota i seguenti aspetti:
- Devi specificare il nome della tabella dove vuoi aggiungere una colonna dopo ALTER TABELLA .
- Il nome della colonna o delle colonne deve essere dopo ADD . Per più colonne, separane i nomi con virgole.
- Specifica i tipi di dati della colonna dopo il nome della colonna .
- Se stai aggiungendo qualsiasi vincolo, una chiave primaria o una chiave esterna , specificalo dopo il tipo di dati .
A scopo dimostrativo, ho creato un database chiamato CodingSight . Lì ho creato tre tabelle denominate tbldepartment , dipendente, e tblCity, e inserito dati fittizi in quelle tabelle.
Il seguente script crea un database e tabelle:
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
Lo script seguente inserisce i dati fittizi nella tabella:
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
Passiamo ora ai casi d'uso.
Aggiungi più colonne a una tabella
Nel nostro esempio, vogliamo aggiungere lo Stato e Codice PIN colonne a tbleCity tavolo. Il tipo di dati dello Stato colonna è VARCHAR e la lunghezza della colonna è 150. Il tipo di dati del Codice PIN la colonna è INTEGER. Per aggiungere colonne, esegui la seguente query:
ALTER TABLE tblCity ADD State VARCHAR(150), Pincode INT
Ora, esegui la query per visualizzare l'elenco delle colonne di tblCity tabella:
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'
L'output della query:
Come puoi vedere, lo Stato e Codice PIN sono state aggiunte le colonne.
Aggiungi colonne chiave primaria a una tabella
Aggiungiamo la colonna Chiave primaria a tblCity tavolo. In base ai requisiti aziendali, dobbiamo aggiungere una colonna con una combinazione di un carattere e un numero di quattro cifre per identificare la città.
Stiamo aggiungendo una nuova colonna denominata City_Code al tblCity tavolo. Il tipo di dati del City_Code è varchar e la lunghezza è cinque. Esegui la query seguente per aggiungere una colonna:
ALTER TABLE tblCity ADD City_Code VARCHAR(5) PRIMARY KEY CLUSTERED
L'output:
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.
La query restituisce un errore perché la chiave primaria deve essere univoca e non nulla. Per aggiungere una colonna a questa tabella, dobbiamo seguire i passaggi seguenti:
Passaggio:1
Crea una nuova tabella vuota denominata tblCity_Temp utilizzando la definizione di tblCity esistente tavolo. La nuova tabella ha una colonna chiave primaria.
Lo script di creazione è il seguente:
CREATE TABLE tblCity_Temp( City_code VARCHAR(5) CONSTRAINT PK_City_Code PRIMARY KEY CLUSTERED,
Name VARCHAR(50), Country VARCHAR(100))
GO
Passaggio:2
Inserisci i dati in tblCity_Temp tabella di tblCity tabella:
INSERT INTO tblCity_Temp (City_code,name, country)VALUES
('C0001','Ahmedabad','India'),
('C0002','Surat','India'),
('C0003','Vadodara','India'),
('C0004','Gandhinagar','India')
GO
Passaggio:3
Rinomina le tabelle come mostrato di seguito:
- Vecchio nome: tblCity – Nuovo nome: tblCity_Old.
- Vecchio nome: tblCity_Temp – Nuovo nome: tblCity .
Presta attenzione alla query di ridenominazione delle tabelle:
USE codingsight
go
EXEC Sp_rename
'tblCity',
'tblCity_Old'
go
EXEC Sp_rename
'tblCity_Temp',
'tblCity'
go
Ora, esegui la seguente query per visualizzare la chiave primaria appena aggiunta:
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
L'output:
Utilizza la query per la visualizzazione dei dati:
SELECT * FROM tblCity c
L'output:
Aggiungi colonne di chiavi esterne a una tabella
Supponiamo di voler aggiungere una colonna denominata deptID al tblEmployee tavolo. Il tipo di dati della colonna è INTEGER. Fa riferimento al departmentID colonna del tbldepartment tabella.
La query è la seguente:
ALTER TABLE tblEmployee ADD deptID INTEGER,CONSTRAINT FK_DepartmentID FOREIGN KEY(deptID) REFERENCES tbldepartment(departmentID)
Esegui la query successiva per visualizzare la nuova colonna della chiave esterna:
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
L'output:
Nota il diagramma ER:
In questo modo, abbiamo creato una chiave esterna denominata FK_DepartmentID .
Aggiungi una colonna con vincolo CHECK e DEFAULT
Ora aggiungiamo una colonna denominata minimum_wages al dipendente tavolo. Il tipo di dati della colonna è denaro .
Il salario_minimo il valore della colonna deve essere maggiore o uguale a 5,60$. Pertanto, abbiamo creato il controllo condizione per verificare il valore inserito – deve essere maggiore di 5,60$. Inoltre, il valore predefinito della colonna è 5,60$.
Per aggiungere la colonna, esegui la seguente query:
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;
Si verifica il seguente errore:
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'.
Il valore specificato per i salari_minimi colonna è inferiore a 5,6. Ecco perché la query ha restituito un errore.
Modifica il valore dei salari_minimi value ed eseguire nuovamente la query:
UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;
L'output:
(1 row affected)
Completion time: 2020-12-14T17:22:40.8995851+05:30
Dopo aver aggiornato il record, esegui la query seguente per visualizzare i dati:
Select * from tblemployee where employeeID=5
L'output:
Per verificare che il vincolo predefinito funzioni, eseguire la seguente istruzione INSERT:
USE codingsight
GO
INSERT INTO tblemployee (name, Address, PhoneNumber,deptID) VALUES ('Dilip Patel','Satyamev Famosa, Gandhinagar','9537021112',1)
Una volta inserito il record, vediamo i dati:
La domanda:
USE CodingSight
go
SELECT * FROM tblemployee t WHERE t.employeeID=25
L'output:
Non ho specificato il valore dei minimum_wages colonna. Quindi, il valore di default viene inserito nella tabella.
Riepilogo
L'articolo ha chiarito l'essenza dell'istruzione ALTER TABLE ADD COLUMN, la sua sintassi e vari casi d'uso delle implementazioni.
Leggi anche
Nozioni di base sull'istruzione ALTER TABLE di SQL Server
Comprensione SQL DELETE Colonna dalla tabella
Comprensione dell'istruzione DROP TABLE IF EXISTS SQL