Denne artikel beskriver SQL Server ALTER TABLE ADD COLUMN-sætningen. Formålet med denne erklæring er at tilføje en ny kolonne til en eksisterende tabel. Artiklen vil også afklare følgende anvendelsestilfælde:
- Tilføj flere kolonner.
- Tilføj en ny primær nøglekolonne.
- Tilføj en ny fremmednøglekolonne.
- Tilføj nye kolonner, der har beregnede kolonner.
- Tilføj en ny kolonne, der har CHECK og UNIQUE begrænsninger.
Syntaksspecificiteten af SQL ALTER TABLE ADD COLUMN-sætningen
Lad os begynde med at forstå syntaksen, da vi skal udforske sætningen grundigt:
Alter table [table_name] add column [column_name] [data_type][constraint]
Bemærk følgende aspekter:
- Du skal angive navnet på tabellen hvor du vil tilføje en kolonne efter ÆNDRE TABEL .
- navnet på kolonnen eller kolonnerne skal være efter ADD . For flere kolonner skal du adskille deres navne med kommaer.
- Angiv kolonnedatatyperne efter kolonnenavnet .
- Hvis du tilføjer en hvilken som helst begrænsning, en primærnøgle eller en fremmednøgle , angiv den efter datatypen .
Til demonstrationsformål har jeg oprettet en database ved navn CodingSight . Der har jeg lavet tre tabeller med navnet tbldepartment , medarbejder og tblCity, og indsatte dummy-data i disse tabeller.
Følgende script opretter en database og tabeller:
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
Nedenstående script indsætter dummy-dataene i tabellen:
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
Lad os nu gå videre til brugstilfældene.
Tilføj flere kolonner til en tabel
I vores eksempel ønsker vi at tilføje Staten og Pinkode kolonner til tbleCity bord. Datatypen forStaten kolonnen er VARCHAR, og kolonnens længde er 150. Datatypen for Pincode kolonne er HELTAL. For at tilføje kolonner skal du køre følgende forespørgsel:
ALTER TABLE tblCity ADD State VARCHAR(150), Pincode INT
Kør nu forespørgslen for at se kolonnelisten for tblCity tabel:
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'
Forespørgselsoutput:
Som du kan se, er Staten og Pinkode kolonner er blevet tilføjet.
Tilføj primære nøglekolonner til en tabel
Lad os tilføje Primary Key-kolonnen til tblCity bord. I henhold til forretningskravene skal vi tilføje en kolonne med en kombination af et tegn og et firecifret tal for at identificere byen.
Vi tilføjer en ny kolonne med navnet City_Code til tblCity bord. Datatypen for City_Code er varchar, og længden er fem. Kør følgende forespørgsel for at tilføje en kolonne:
ALTER TABLE tblCity ADD City_Code VARCHAR(5) PRIMARY KEY CLUSTERED
Udgangen:
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.
Forespørgslen returnerer en fejl, fordi den primære nøgle skal være unik og ikke null. For at tilføje en kolonne til denne tabel skal vi følge nedenstående trin:
Trin:1
Opret en ny tom tabel med navnet tblCity_Temp ved at bruge definitionen af den eksisterende tblCity bord. Den nye tabel har en primær nøglekolonne.
Oprettelsesscriptet er som følger:
CREATE TABLE tblCity_Temp( City_code VARCHAR(5) CONSTRAINT PK_City_Code PRIMARY KEY CLUSTERED,
Name VARCHAR(50), Country VARCHAR(100))
GO
Trin:2
Indsæt dataene i tblCity_Temp tabel fra tblCity tabel:
INSERT INTO tblCity_Temp (City_code,name, country)VALUES
('C0001','Ahmedabad','India'),
('C0002','Surat','India'),
('C0003','Vadodara','India'),
('C0004','Gandhinagar','India')
GO
Trin:3
Omdøb tabellerne som vist nedenfor:
- Gamle navn: tblCity – Nyt navn: tblCity_Old.
- Gamle navn: tblCity_Temp – Nyt navn: tblCity .
Vær opmærksom på forespørgslen om tabelnavn:
USE codingsight
go
EXEC Sp_rename
'tblCity',
'tblCity_Old'
go
EXEC Sp_rename
'tblCity_Temp',
'tblCity'
go
Kør nu følgende forespørgsel for at se den nyligt tilføjede primærnøgle:
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
Oputtet:
Brug forespørgslen til datavisning:
SELECT * FROM tblCity c
Oputtet:
Tilføj udenlandske nøglekolonner til en tabel
Antag, at vi vil tilføje en kolonne med navnet deptID til tblEmployee bord. Kolonnens datatype er INTEGER. Det refererer til afdelings-ID kolonne i tbldepartment tabel.
Forespørgslen er følgende:
ALTER TABLE tblEmployee ADD deptID INTEGER,CONSTRAINT FK_DepartmentID FOREIGN KEY(deptID) REFERENCES tbldepartment(departmentID)
Kør den næste forespørgsel for at se den nye fremmednøglekolonne:
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
Oputtet:
Bemærk ER-diagrammet:
På denne måde har vi oprettet en fremmednøgle ved navn FK_DepartmentID .
Tilføj en kolonne med CHECK og DEFAULT Constraint
Lad os nu tilføje en kolonne med navnet minimum_løn til medarbejderen bord. Kolonnens datatype er penge .
minimumslønnen kolonnens værdi skal være større eller lig med 5,60 $. Derfor har vi oprettet check betingelse for at verificere den indsatte værdi – den skal være højere end 5,60$. Desuden standardværdien af kolonnen er 5,60$.
For at tilføje kolonnen skal du køre følgende forespørgsel:
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;
Følgende fejl opstår:
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'.
Værdien angivet for minimumsløn kolonne er mindre end 5,6. Det er derfor, forespørgslen har returneret en fejl.
Skift værdien af minimumsløn værdi og udfør forespørgslen igen:
UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;
Oputtet:
(1 row affected)
Completion time: 2020-12-14T17:22:40.8995851+05:30
Når vi har opdateret posten, skal du køre nedenstående forespørgsel for at se dataene:
Select * from tblemployee where employeeID=5
Oputtet:
For at bekræfte, at standardbegrænsningen virker, skal du køre følgende INSERT-sætning:
USE codingsight
GO
INSERT INTO tblemployee (name, Address, PhoneNumber,deptID) VALUES ('Dilip Patel','Satyamev Famosa, Gandhinagar','9537021112',1)
Når posten er indsat, lad os se dataene:
Forespørgslen:
USE CodingSight
go
SELECT * FROM tblemployee t WHERE t.employeeID=25
Oputtet:
Jeg har ikke angivet værdien af minimumsløn kolonne. Derfor er standardværdien indsat i tabellen.
Oversigt
Artiklen præciserede essensen af ALTER TABLE ADD COLUMN-sætningen, dens syntaks og forskellige anvendelsestilfælde af implementeringer.
Læs også
Grundlæggende om SQL Server ALTER TABLE-erklæring
Forstå SQL DELETE-kolonne fra tabel
Forstå DROP TABLE HVIS FINDER SQL-sætning