Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Informazioni sull'istruzione ALTER TABLE ADD COLUMN di SQL Server

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:

  1. Aggiungi più colonne.
  2. Aggiungi una nuova colonna di chiave primaria.
  3. Aggiungi una nuova colonna di chiave esterna.
  4. Aggiungi nuove colonne con colonne calcolate.
  5. 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:

  1. Devi specificare il nome della tabella dove vuoi aggiungere una colonna dopo ALTER TABELLA .
  2. Il nome della colonna o delle colonne deve essere dopo ADD . Per più colonne, separane i nomi con virgole.
  3. Specifica i tipi di dati della colonna dopo il nome della colonna .
  4. 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:

  1. Vecchio nome: tblCityNuovo nome: tblCity_Old.
  2. Vecchio nome: tblCity_TempNuovo 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