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:
- Voeg meerdere kolommen toe.
- Voeg een nieuwe primaire sleutelkolom toe.
- Voeg een nieuwe externe sleutelkolom toe.
- Nieuwe kolommen met berekende kolommen toevoegen.
- 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:
- U moet de naam van de tabel opgeven waar u een kolom wilt toevoegen na WIJZIG TABEL .
- De naam van de kolom of kolommen moet na ADD be zijn . Voor meerdere kolommen, scheid hun namen met komma's.
- Geef de kolomgegevenstypen op achter de kolomnaam .
- 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:
- Oude naam: tblCity – Nieuwe naam: tblCity_Old.
- Oude naam: tblCity_Temp – Nieuwe 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