Тази статия описва оператора ALTER TABLE ADD COLUMN на SQL Server. Целта на това изявление е да добави нова колона към съществуваща таблица. Също така, статията ще изясни следните случаи на употреба:
- Добавяне на няколко колони.
- Добавете нова колона с първичен ключ.
- Добавете нова колона с външен ключ.
- Добавете нови колони, които имат изчислени колони.
- Добавете нова колона, която има ограничения CHECK и UNIQUE.
Специфичността на синтаксиса на SQL ALTER TABLE ADD COLUMN оператор
Тъй като ще проучим задълбочено изявлението, нека започнем с разбирането на синтаксиса:
Alter table [table_name] add column [column_name] [data_type][constraint]
Обърнете внимание на следните аспекти:
- Трябва да посочите името на таблицата където искате да добавите колона след СМЕНА ТАБЛИЦА .
- Името на колоната или колоните трябва да е след ДОБАВЯНЕ . За няколко колони отделете имената им със запетаи.
- Посочете типовете данни за колони след името на колоната .
- Ако добавяте някакво ограничение, първичен ключ или външен ключ , посочете го след типа данни .
За демонстрационни цели създадох база данни с име CodingSight . Там създадох три таблици с име tbldepartment ,служител, и tblCity, и вмъкнах фиктивни данни в тези таблици.
Следният скрипт създава база данни и таблици:
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
Скриптът по-долу вмъква фиктивните данни в таблицата:
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
Сега да преминем към случаите на използване.
Добавяне на няколко колони към таблица
В нашия пример искаме да добавим Състояние и Пинкод колони към tbleCity маса. Типът данни насъстояние колоната е VARCHAR, а дължината на колоната е 150. Типът данни на Pincode колоната е INTEGER. За да добавите колони, изпълнете следната заявка:
ALTER TABLE tblCity ADD State VARCHAR(150), Pincode INT
Сега изпълнете заявката, за да видите списъка с колони на tblCity таблица:
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'
Изходът на заявката:
Както можете да видите, вДържавата и Пинкод колони са добавени.
Добавяне на колони с първичен ключ към таблица
Нека добавим колоната Първичен ключ към tblCity маса. Съгласно бизнес изискванията трябва да добавим колона с комбинация от знак и четирицифрено число, за да идентифицираме града.
Добавяме нова колона с име City_Code доtblCity маса. Типът данни на City_Code е varchar, а дължината е пет. Изпълнете следната заявка, за да добавите колона:
ALTER TABLE tblCity ADD City_Code VARCHAR(5) PRIMARY KEY CLUSTERED
Изходът:
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.
Заявката връща грешка, тъй като първичният ключ трябва да е уникален, а не нулев. За да добавим колона към тази таблица, трябва да изпълним следните стъпки:
Стъпка:1
Създайте нова празна таблица с име tblCity_Temp използвайки дефиницията на съществуващия tblCity маса. Новата таблица има колона с първичен ключ.
Скриптът за създаване е както следва:
CREATE TABLE tblCity_Temp( City_code VARCHAR(5) CONSTRAINT PK_City_Code PRIMARY KEY CLUSTERED,
Name VARCHAR(50), Country VARCHAR(100))
GO
Стъпка:2
Поставете данните в tblCity_Temp таблица от tblCity таблица:
INSERT INTO tblCity_Temp (City_code,name, country)VALUES
('C0001','Ahmedabad','India'),
('C0002','Surat','India'),
('C0003','Vadodara','India'),
('C0004','Gandhinagar','India')
GO
Стъпка:3
Преименувайте таблиците, както е показано по-долу:
- Старо име: tblCity – Ново име: tblCity_Old.
- Старо име: tblCity_Temp – Ново име: tblCity .
Обърнете внимание на заявката за преименуване на таблица:
USE codingsight
go
EXEC Sp_rename
'tblCity',
'tblCity_Old'
go
EXEC Sp_rename
'tblCity_Temp',
'tblCity'
go
Сега изпълнете следната заявка, за да видите новодобавения първичен ключ:
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
Изходът:
Използвайте заявката за преглед на данните:
SELECT * FROM tblCity c
Изходът:
Добавяне на колони за чужд ключ към таблица
Да предположим, че искаме да добавим колона с име deptID доtblEmployee маса. Типът данни на колоната е INTEGER. Той препраща към departmentID колона на tbldepartment таблица.
Заявката е следната:
ALTER TABLE tblEmployee ADD deptID INTEGER,CONSTRAINT FK_DepartmentID FOREIGN KEY(deptID) REFERENCES tbldepartment(departmentID)
Изпълнете следващата заявка, за да видите новата колона за външен ключ:
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
Изходът:
Обърнете внимание на ER диаграмата:
По този начин създадохме външен ключ с име FK_DepartmentID .
Добавете колона с ПРОВЕРКА и Ограничение ПО ПОДРАЗБИРАНЕ
Сега нека добавим колона с име minimum_wages дослужитела маса. Типът данни на колоната е пари .
минималната_заплата Стойността на колоната трябва да е по-голяма или равна на 5,60 $. Затова създадохме чек условие за проверка на въведената стойност – тя трябва да е по-висока от 5,60$. Освен това стойността по подразбиране от колоната е 5,60$.
За да добавите колоната, изпълнете следната заявка:
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;
Възниква следната грешка:
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'.
Стойността, посочена за minimum_wages колона е по-малко от 5,6. Ето защо заявката е върнала грешка.
Променете стойността на minimum_wages стойност и изпълнете заявката отново:
UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;
Изходът:
(1 row affected)
Completion time: 2020-12-14T17:22:40.8995851+05:30
След като актуализираме записа, изпълнете заявката по-долу, за да видите данните:
Select * from tblemployee where employeeID=5
Изходът:
За да проверите дали ограничението по подразбиране работи, изпълнете следния оператор INSERT:
USE codingsight
GO
INSERT INTO tblemployee (name, Address, PhoneNumber,deptID) VALUES ('Dilip Patel','Satyamev Famosa, Gandhinagar','9537021112',1)
След като записът е вмъкнат, нека видим данните:
Заявката:
USE CodingSight
go
SELECT * FROM tblemployee t WHERE t.employeeID=25
Изходът:
Не съм посочил стойността на minimum_wages колона. Следователно стойността по подразбиране се вмъква в таблицата.
Резюме
Статията изяснява същността на оператора ALTER TABLE ADD COLUMN, неговия синтаксис и различни случаи на използване на имплементации.
Прочетете също
Основи на оператора ALTER TABLE на SQL Server
Разбиране на SQL DELETE Колона от таблица
Разбиране на DROP TABLE IF EXISTS SQL оператор