sql >> Database >  >> RDS >> Sqlserver

Inzicht in SQL Server ALTER TABLE ADD COLUMN-instructie

In dit artikel wordt de instructie SQL Server ALTER TABLE ADD COLUMN beschreven. Het doel van deze instructie is om een ​​nieuwe kolom toe te voegen aan een bestaande tabel. Het artikel zal ook de volgende gebruikssituaties verduidelijken:

  1. Voeg meerdere kolommen toe.
  2. Voeg een nieuwe primaire sleutelkolom toe.
  3. Voeg een nieuwe externe sleutelkolom toe.
  4. Nieuwe kolommen met berekende kolommen toevoegen.
  5. Voeg een nieuwe kolom toe met de beperkingen CHECK en UNIQUE.

De syntaxisspecificiteit van de SQL ALTER TABLE ADD COLUMN-instructie

Laten we, aangezien we de verklaring grondig gaan onderzoeken, beginnen met het begrijpen van de syntaxis:

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

Let op de volgende aspecten:

  1. U moet de naam van de tabel opgeven waar u een kolom wilt toevoegen na WIJZIG TABEL .
  2. De naam van de kolom of kolommen moet na ADD be zijn . Voor meerdere kolommen, scheid hun namen met komma's.
  3. Geef de kolomgegevenstypen op achter de kolomnaam .
  4. Als u een beperking, een primaire sleutel of een externe sleutel toevoegt , specificeer het na het gegevenstype .

Voor demonstratiedoeleinden heb ik een database gemaakt met de naam CodingSight . Daar heb ik drie tabellen gemaakt met de naam tbldepartment , medewerker, en tblCity, en dummy-gegevens in die tabellen ingevoegd.

Het volgende script maakt een database en tabellen aan:

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

Het onderstaande script voegt de dummy-gegevens in de tabel in:

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

Laten we nu verder gaan met de use-cases.

Meerdere kolommen aan een tabel toevoegen

In ons voorbeeld willen we de Status . toevoegen en Pincode kolommen naar de tbleCity tafel. Het datatype van de Staat kolom is VARCHAR en de lengte van de kolom is 150. Het gegevenstype van de Pincode kolom is INTEGER. Voer de volgende query uit om kolommen toe te voegen:

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

Voer nu de query uit om de kolomlijst van de tblCity . te bekijken tafel:

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'

De query-uitvoer:

Zoals je kunt zien, is de Status en Pincode kolommen zijn toegevoegd.

Primaire sleutelkolommen aan een tabel toevoegen

Laten we de kolom Primaire sleutel toevoegen aan de tblCity tafel. Volgens de zakelijke vereisten moeten we een kolom toevoegen met een combinatie van een teken en een viercijferig nummer om de stad te identificeren.

We voegen een nieuwe kolom toe met de naam City_Code naar de tblCity tafel. Het gegevenstype van de City_Code is varchar, en de lengte is vijf. Voer de volgende query uit om een ​​kolom toe te voegen:

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

De uitvoer:

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.

De query retourneert een fout omdat de primaire sleutel uniek moet zijn en niet null. Om een ​​kolom aan deze tabel toe te voegen, moeten we de onderstaande stappen volgen:

Stap:1

Maak een nieuwe lege tabel met de naam tblCity_Temp gebruikmakend van de definitie van de bestaande tblCity tafel. De nieuwe tabel heeft een primaire sleutelkolom.

Het aanmaakscript is als volgt:

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

Stap:2

Voeg de gegevens toe aan de tblCity_Temp tafel uit de tblCity tafel:

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

Stap:3

Hernoem de tabellen zoals hieronder getoond:

  1. Oude naam: tblCityNieuwe naam: tblCity_Old.
  2. Oude naam: tblCity_TempNieuwe naam: tblCity .

Besteed aandacht aan de tabel hernoemen query:

USE codingsight 
go 

EXEC Sp_rename 
  'tblCity', 
  'tblCity_Old' 
go 

EXEC Sp_rename 
  'tblCity_Temp', 
  'tblCity' 
go

Voer nu de volgende query uit om de nieuw toegevoegde primaire sleutel te bekijken:

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  

De uitvoer:

Gebruik de query voor het bekijken van gegevens:

SELECT * FROM tblCity c

De uitvoer:

Voeg kolommen met externe sleutels toe aan een tabel

Stel dat we een kolom willen toevoegen met de naam deptID aan de tblEmployee tafel. Het gegevenstype van de kolom is INTEGER. Het verwijst naar de departmentID kolom van de tblafdeling tafel.

De vraag is de volgende:

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

Voer de volgende query uit om de nieuwe kolom voor refererende sleutels te bekijken:

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   

De uitvoer:

Let op het ER-diagram:

Op deze manier hebben we een externe sleutel gemaakt met de naam FK_DepartmentID .

Voeg een kolom toe met CHECK en DEFAULT Constraint

Laten we nu een kolom toevoegen met de naam minimum_lonen aan de tblemloyee tafel. Het gegevenstype van de kolom is geld .

Het minimum_loon de waarde van de kolom moet groter of gelijk zijn aan 5.60$. Daarom hebben we de check . gemaakt voorwaarde om de ingevoerde waarde te verifiëren – deze moet hoger zijn dan 5.60$. Bovendien is de standaardwaarde van de kolom is 5.60$.

Voer de volgende query uit om de kolom toe te voegen:

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;

De volgende fout treedt op:

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

De waarde die is opgegeven voor de minimum_lonen kolom kleiner is dan 5,6. Daarom heeft de query een fout geretourneerd.

Wijzig de waarde van de minimum_lonen waarde en voer de query opnieuw uit:

UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;

De uitvoer:

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

Nadat we het record hebben bijgewerkt, voert u de onderstaande query uit om de gegevens te bekijken:

Select * from tblemployee where employeeID=5

De uitvoer:

Voer de volgende INSERT-instructie uit om te controleren of de standaardbeperking werkt:

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

Zodra het record is ingevoegd, laten we de gegevens bekijken:

De vraag:

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

De uitvoer:

Ik heb de waarde van de minimum_lonen . niet gespecificeerd kolom. Daarom wordt de standaardwaarde in de tabel ingevoegd.

Samenvatting

Het artikel verduidelijkte de essentie van de ALTER TABLE ADD COLUMN-instructie, de syntaxis en verschillende use-cases van implementaties.

Lees ook

Basisprincipes van SQL Server ALTER TABLE-instructie
Inzicht in SQL DELETE Kolom uit tabel
DROP TABLE ALS BESTAAT SQL-instructie begrijpen


  1. Een tabel koppelen aan een backend-database in Access 2016

  2. Oracle's standaard DATE-indeling

  3. SetDate gebruiken in PreparedStatement

  4. CURRENT_DATE Functie in Oracle