Den här artikeln beskriver SQL Server ALTER TABLE ADD COLUMN-satsen. Syftet med detta uttalande är att lägga till en ny kolumn i en befintlig tabell. Dessutom kommer artikeln att förtydliga följande användningsfall:
- Lägg till flera kolumner.
- Lägg till en ny primärnyckelkolumn.
- Lägg till en ny kolumn för främmande nyckel.
- Lägg till nya kolumner som har beräknade kolumner.
- Lägg till en ny kolumn som har CHECK och UNIKA begränsningar.
Syntaxspecificiteten för SQL ALTER TABLE ADD COLUMN-satsen
När vi ska utforska uttalandet grundligt, låt oss börja med att förstå syntaxen:
Alter table [table_name] add column [column_name] [data_type][constraint]
Observera följande aspekter:
- Du måste ange namnet på tabellen där du vill lägga till en kolumn efter ÄNDRA TABELL .
- namnet på kolumnen eller kolumnerna måste vara efter ADD . För flera kolumner, separera deras namn med kommatecken.
- Ange kolumndatatyperna efter kolumnnamnet .
- Om du lägger till någon begränsning, en primärnyckel eller en främmande nyckel , ange det efter datatypen .
För demonstrationsändamål har jag skapat en databas med namnet CodingSight . Där har jag skapat tre tabeller som heter tbldepartment , anställd, och tblCity, och infogade dummydata i dessa tabeller.
Följande skript skapar en databas och 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
Skriptet nedan infogar dummydata 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
Låt oss nu gå vidare till användningsfallen.
Lägg till flera kolumner i en tabell
I vårt exempel vill vi lägga till Staten och Pincode kolumner till tbleCity tabell. Datatypen förStaten kolumnen är VARCHAR och längden på kolumnen är 150. Datatypen för Pincode kolumnen är INTEGER. För att lägga till kolumner, kör följande fråga:
ALTER TABLE tblCity ADD State VARCHAR(150), Pincode INT
Kör nu frågan för att se kolumnlistan för tblCity tabell:
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'
Frågeutgången:
Som du kan se är Staten och Pincode kolumner har lagts till.
Lägg till primära nyckelkolumner i en tabell
Låt oss lägga till kolumnen Primärnyckel i tblCity tabell. Enligt affärskraven måste vi lägga till en kolumn med en kombination av ett tecken och ett fyrsiffrigt nummer för att identifiera staden.
Vi lägger till en ny kolumn med namnet Stadskod till tblCity tabell. Datatypen för Stadskod är varchar, och längden är fem. Kör följande fråga för att lägga till en kolumn:
ALTER TABLE tblCity ADD City_Code VARCHAR(5) PRIMARY KEY CLUSTERED
Utdata:
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.
Frågan returnerar ett fel eftersom primärnyckeln måste vara unik och inte null. För att lägga till en kolumn i den här tabellen måste vi följa stegen nedan:
Steg:1
Skapa en ny tom tabell med namnet tblCity_Temp med definitionen av den befintliga tblCity tabell. Den nya tabellen har en primärnyckelkolumn.
Skapandet skriptet är som följer:
CREATE TABLE tblCity_Temp( City_code VARCHAR(5) CONSTRAINT PK_City_Code PRIMARY KEY CLUSTERED,
Name VARCHAR(50), Country VARCHAR(100))
GO
Steg:2
Infoga data i tblCity_Temp tabellen från tblCity tabell:
INSERT INTO tblCity_Temp (City_code,name, country)VALUES
('C0001','Ahmedabad','India'),
('C0002','Surat','India'),
('C0003','Vadodara','India'),
('C0004','Gandhinagar','India')
GO
Steg:3
Byt namn på tabellerna enligt nedan:
- Gammalt namn: tblCity – Nytt namn: tblCity_Old.
- Gammalt namn: tblCity_Temp – Nytt namn: tblCity .
Var uppmärksam på frågan om namn på tabeller:
USE codingsight
go
EXEC Sp_rename
'tblCity',
'tblCity_Old'
go
EXEC Sp_rename
'tblCity_Temp',
'tblCity'
go
Kör nu följande fråga för att se den nyligen tillagda primärnyckeln:
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
Utgången:
Använd frågan för datavisning:
SELECT * FROM tblCity c
Utgången:
Lägg till främmande nyckelkolumner i en tabell
Anta att vi vill lägga till en kolumn med namnet deptID till tblEmployee tabell. Datatypen för kolumnen är INTEGER. Den refererar till avdelnings-ID kolumnen i tbldepartment bord.
Frågan är följande:
ALTER TABLE tblEmployee ADD deptID INTEGER,CONSTRAINT FK_DepartmentID FOREIGN KEY(deptID) REFERENCES tbldepartment(departmentID)
Kör nästa fråga för att se den nya kolumnen för främmande nyckel:
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
Utgången:
Notera ER-diagrammet:
På så sätt har vi skapat en främmande nyckel som heter FK_DepartmentID .
Lägg till en kolumn med CHECK och DEFAULT Constraint
Låt oss nu lägga till en kolumn med namnet minimum_löner till anställda tabell. Datatypen för kolumnen är pengar .
minimilönen kolumns värde måste vara större eller lika med 5,60 $. Därför har vi skapat checken villkor för att verifiera det infogade värdet – det måste vara högre än 5,60 $. Dessutom är standardvärdet av kolumnen är 5,60 $.
För att lägga till kolumnen, kör följande fråga:
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öljande fel uppstå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ärdet som anges för minimum_löner kolumnen är mindre än 5,6. Det är därför frågan har returnerat ett fel.
Ändra värdet på minimumlöner värde och kör frågan igen:
UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;
Utgången:
(1 row affected)
Completion time: 2020-12-14T17:22:40.8995851+05:30
När vi har uppdaterat posten, kör nedanstående fråga för att se data:
Select * from tblemployee where employeeID=5
Utgången:
För att verifiera att standardbegränsningen fungerar, kör följande INSERT-sats:
USE codingsight
GO
INSERT INTO tblemployee (name, Address, PhoneNumber,deptID) VALUES ('Dilip Patel','Satyamev Famosa, Gandhinagar','9537021112',1)
När posten har infogats, låt oss se data:
Frågan:
USE CodingSight
go
SELECT * FROM tblemployee t WHERE t.employeeID=25
Utgången:
Jag har inte angett värdet på minimumlöner kolumn. Därför infogas standardvärdet i tabellen.
Sammanfattning
Artikeln klargjorde essensen av ALTER TABLE ADD COLUMN-satsen, dess syntax och olika användningsfall av implementeringar.
Läs också
Grunderna i SQL Server ALTER TABLE Statement
Förstå SQL DELETE Kolumn från tabell
Förstå DROP TABLE OM FINNS SQL-sats