Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Présentation de l'instruction ALTER TABLE ADD COLUMN de SQL Server

Cet article décrit l'instruction SQL Server ALTER TABLE ADD COLUMN. Le but de cette instruction est d'ajouter une nouvelle colonne à une table existante. En outre, l'article clarifiera les cas d'utilisation suivants :

  1. Ajouter plusieurs colonnes.
  2. Ajouter une nouvelle colonne de clé primaire.
  3. Ajouter une nouvelle colonne de clé étrangère.
  4. Ajouter de nouvelles colonnes contenant des colonnes calculées.
  5. Ajouter une nouvelle colonne avec les contraintes CHECK et UNIQUE.

La spécificité de la syntaxe de l'instruction SQL ALTER TABLE ADD COLUMN

Comme nous allons explorer l'instruction en profondeur, commençons par comprendre la syntaxe :

Alter table [table_name] add column [column_name] [data_type][constraint]

Notez les aspects suivants :

  1. Vous devez spécifier le nom de la table où vous voulez ajouter une colonne après ALTER TABLE .
  2. Le nom de la ou des colonnes doit être après ADD . Pour plusieurs colonnes, séparez leurs noms par des virgules.
  3. Spécifiez les types de données de la colonne après le nom de la colonne .
  4. Si vous ajoutez une contrainte, une clé primaire ou une clé étrangère , spécifiez-le après le type de données .

À des fins de démonstration, j'ai créé une base de données nommée CodingSight . Là, j'ai créé trois tables nommées tbldepartment , tblemployé, et tblCity, et inséré des données factices dans ces tables.

Le script suivant crée une base de données et des tables :

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

Le script ci-dessous insère les données factices dans le tableau :

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

Passons maintenant aux cas d'utilisation.

Ajouter plusieurs colonnes à un tableau

Dans notre exemple, nous voulons ajouter le État et Pincode colonnes à tbleCity table. Le type de données de l'État colonne est VARCHAR et la longueur de la colonne est 150. Le type de données du Pincode colonne est INTEGER. Pour ajouter des colonnes, exécutez la requête suivante :

ALTER TABLE tblCity ADD State VARCHAR(150), Pincode INT

Maintenant, exécutez la requête pour afficher la liste des colonnes de tblCity tableau :

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'

Le résultat de la requête :

Comme vous pouvez le voir, l'État et Pincode des colonnes ont été ajoutées.

Ajouter des colonnes de clé primaire à une table

Ajoutons la colonne Primary Key à tblCity table. Selon les besoins de l'entreprise, nous devons ajouter une colonne avec une combinaison d'un caractère et d'un nombre à quatre chiffres pour identifier la ville.

Nous ajoutons une nouvelle colonne nommée City_Code à la tblCity table. Le type de données du City_Code est varchar, et la longueur est cinq. Exécutez la requête suivante pour ajouter une colonne :

ALTER TABLE tblCity ADD City_Code VARCHAR(5) PRIMARY KEY  CLUSTERED

Le résultat :

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 requête renvoie une erreur car la clé primaire doit être unique et non nulle. Pour ajouter une colonne à ce tableau, nous devons suivre les étapes ci-dessous :

Étape : 1

Créez une nouvelle table vide nommée tblCity_Temp en utilisant la définition de la tblCity existante table. La nouvelle table a une colonne de clé primaire.

Le script de création est le suivant :

CREATE TABLE tblCity_Temp( City_code VARCHAR(5) CONSTRAINT PK_City_Code PRIMARY KEY CLUSTERED,
Name VARCHAR(50), Country VARCHAR(100))
GO

Étape : 2

Insérez les données dans tblCity_Temp table de tblCity tableau :

INSERT INTO tblCity_Temp (City_code,name, country)VALUES 
('C0001','Ahmedabad','India'),
('C0002','Surat','India'),
('C0003','Vadodara','India'),
('C0004','Gandhinagar','India')
GO

Étape :3

Renommez les tables comme indiqué ci-dessous :

  1. Ancien nom : tblCityNouveau nom : tblCity_Old.
  2. Ancien nom : tblCity_TempNouveau nom : tblCity .

Faites attention à la requête de renommage de table :

USE codingsight 
go 

EXEC Sp_rename 
  'tblCity', 
  'tblCity_Old' 
go 

EXEC Sp_rename 
  'tblCity_Temp', 
  'tblCity' 
go

Maintenant, exécutez la requête suivante pour afficher la clé primaire nouvellement ajoutée :

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  

Le résultat :

Utilisez la requête pour la visualisation des données :

SELECT * FROM tblCity c

Le résultat :

Ajouter des colonnes de clé étrangère à une table

Supposons que nous voulions ajouter une colonne nommée deptID au tblEmployee table. Le type de données de la colonne est INTEGER. Il fait référence au departmentID colonne du tbldepartement tableau.

La requête est la suivante :

ALTER TABLE tblEmployee ADD deptID INTEGER,CONSTRAINT  FK_DepartmentID FOREIGN KEY(deptID) REFERENCES tbldepartment(departmentID)

Exécutez la requête suivante pour afficher la nouvelle colonne de clé étrangère :

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   

Le résultat :

Notez le diagramme ER :

De cette façon, nous avons créé une clé étrangère nommée FK_DepartmentID .

Ajouter une colonne avec les contraintes CHECK et DEFAULT

Maintenant, ajoutons une colonne nommée minimum_wages au tblemployé table. Le type de données de la colonne est money .

Le salaire_minimum la valeur de la colonne doit être supérieure ou égale à 5,60 $. Par conséquent, nous avons créé le chèque condition pour vérifier la valeur insérée – elle doit être supérieure à 5,60 $. De plus, la valeur par défaut de la colonne est de 5,60 $.

Pour ajouter la colonne, exécutez la requête suivante :

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;

L'erreur suivante se produit :

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'.

La valeur spécifiée pour le minimum_wages colonne est inférieure à 5,6. C'est pourquoi la requête a renvoyé une erreur.

Modifier la valeur des minimum_wages valeur et exécutez à nouveau la requête :

UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;

Le résultat :

(1 row affected)
Completion time: 2020-12-14T17:22:40.8995851+05:30

Une fois que nous avons mis à jour l'enregistrement, exécutez la requête ci-dessous pour afficher les données :

Select * from tblemployee where employeeID=5

Le résultat :

Pour vérifier que la contrainte par défaut fonctionne, exécutez l'instruction INSERT suivante :

USE codingsight 
GO
INSERT INTO tblemployee (name, Address, PhoneNumber,deptID) VALUES ('Dilip Patel','Satyamev Famosa, Gandhinagar','9537021112',1)

Une fois l'enregistrement inséré, visualisons les données :

La requête :

USE CodingSight
go
SELECT * FROM tblemployee t WHERE t.employeeID=25

Le résultat :

Je n'ai pas précisé la valeur du minimum_wages colonne. Par conséquent, la valeur par défaut est insérée dans le tableau.

Résumé

L'article a clarifié l'essence de l'instruction ALTER TABLE ADD COLUMN, sa syntaxe et divers cas d'utilisation d'implémentations.

Lire aussi

Principes de base de l'instruction SQL Server ALTER TABLE
Comprendre la colonne SQL DELETE de la table
Comprendre l'instruction SQL DROP TABLE IF EXISTS