Bài viết này mô tả câu lệnh SQL Server ALTER TABLE ADD COLUMN. Mục đích của câu lệnh này là thêm một cột mới vào bảng hiện có. Ngoài ra, bài viết sẽ làm rõ các trường hợp sử dụng sau:
- Thêm nhiều cột.
- Thêm một cột khóa chính mới.
- Thêm một cột khóa ngoại mới.
- Thêm các cột mới có các cột được tính toán.
- Thêm một cột mới có ràng buộc KIỂM TRA và DUY NHẤT.
Đặc điểm cú pháp của câu lệnh SQL ALTER TABLE ADD COLUMN
Khi chúng ta sẽ tìm hiểu kỹ câu lệnh, hãy bắt đầu với việc hiểu cú pháp:
Alter table [table_name] add column [column_name] [data_type][constraint]
Lưu ý các khía cạnh sau:
- Bạn cần chỉ định tên của bảng nơi bạn muốn thêm cột sau BẢNG ALTER .
- Tên của cột hoặc các cột phải sau ADD . Đối với nhiều cột, hãy phân tách tên của chúng bằng dấu phẩy.
- Chỉ định kiểu dữ liệu cột sau tên cột .
- Nếu bạn đang thêm bất kỳ ràng buộc nào, khóa chính hoặc khóa ngoại , chỉ định nó sau loại dữ liệu .
Với mục đích trình diễn, tôi đã tạo cơ sở dữ liệu có tên CodingSight . Ở đó, tôi đã tạo ba bảng có tên tbldepartment , nhân viên thất nghiệp, và tblCity, và chèn dữ liệu giả vào các bảng đó.
Tập lệnh sau tạo cơ sở dữ liệu và bảng:
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
Tập lệnh dưới đây chèn dữ liệu giả vào bảng:
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
Bây giờ, chúng ta hãy tiến hành các trường hợp sử dụng.
Thêm nhiều cột vào bảng
Trong ví dụ của chúng tôi, chúng tôi muốn thêm Trạng thái và Pincode cột của tbleCity bàn. Loại dữ liệu của Trạng thái cột là VARCHAR và độ dài của cột là 150. Loại dữ liệu của Pincode cột là INTEGER. Để thêm cột, hãy chạy truy vấn sau:
ALTER TABLE tblCity ADD State VARCHAR(150), Pincode INT
Bây giờ, hãy chạy truy vấn để xem danh sách cột của tblCity bảng:
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'
Kết quả truy vấn:
Như bạn có thể thấy, Bang và Pincode các cột đã được thêm vào.
Thêm các cột khóa chính vào bảng
Hãy để chúng tôi thêm cột Khóa chính vào tblCity bàn. Theo yêu cầu kinh doanh, chúng tôi phải thêm một cột có sự kết hợp của một ký tự và một số có bốn chữ số để xác định thành phố.
Chúng tôi đang thêm một cột mới có tên City_Code đến tblCity bàn. Loại dữ liệu của City_Code là varchar và độ dài là năm. Chạy truy vấn sau để thêm cột:
ALTER TABLE tblCity ADD City_Code VARCHAR(5) PRIMARY KEY CLUSTERED
Đầu ra:
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.
Truy vấn trả về lỗi vì khóa chính phải là duy nhất và không được rỗng. Để thêm một cột vào bảng này, chúng ta phải làm theo các bước sau:
Bước:1
Tạo một bảng trống mới có tên tblCity_Temp sử dụng định nghĩa của tblCity hiện có bàn. Bảng mới có một cột khóa chính.
Tập lệnh tạo như sau:
CREATE TABLE tblCity_Temp( City_code VARCHAR(5) CONSTRAINT PK_City_Code PRIMARY KEY CLUSTERED,
Name VARCHAR(50), Country VARCHAR(100))
GO
Bước:2
Chèn dữ liệu vào tblCity_Temp bảng từ tblCity bảng:
INSERT INTO tblCity_Temp (City_code,name, country)VALUES
('C0001','Ahmedabad','India'),
('C0002','Surat','India'),
('C0003','Vadodara','India'),
('C0004','Gandhinagar','India')
GO
Bước:3
Đổi tên các bảng như hình dưới đây:
- Tên Cũ: tblCity - Tên mới: tblCity_Old.
- Tên Cũ: tblCity_Temp - Tên mới: tblCity .
Chú ý đến truy vấn đổi tên bảng:
USE codingsight
go
EXEC Sp_rename
'tblCity',
'tblCity_Old'
go
EXEC Sp_rename
'tblCity_Temp',
'tblCity'
go
Bây giờ, hãy chạy truy vấn sau để xem khóa chính mới được thêm vào:
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
Kết quả:
Sử dụng truy vấn để xem dữ liệu:
SELECT * FROM tblCity c
Kết quả:
Thêm các cột khóa ngoài vào bảng
Giả sử chúng ta muốn thêm một cột có tên deptID tới tblEprisee bàn. Kiểu dữ liệu của cột là INTEGER. Nó tham chiếu đến ID của bộ phận cột của tbldepartment bảng.
Truy vấn như sau:
ALTER TABLE tblEmployee ADD deptID INTEGER,CONSTRAINT FK_DepartmentID FOREIGN KEY(deptID) REFERENCES tbldepartment(departmentID)
Chạy truy vấn tiếp theo để xem cột khóa ngoại mới:
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
Kết quả:
Lưu ý Sơ đồ ER:
Bằng cách này, chúng tôi đã tạo khóa ngoại có tên FK_DepartmentID .
Thêm cột có Ràng buộc CHECK và DEFAULT
Bây giờ, hãy để chúng tôi thêm một cột có tên Minim_wages cho người thất nghiệp bàn. Loại dữ liệu của cột là tiền .
Minim_wage giá trị của cột phải lớn hơn hoặc bằng 5,60 $. Do đó, chúng tôi đã tạo séc điều kiện để xác minh giá trị đã chèn - giá trị đó phải cao hơn 5,60 $. Hơn nữa, giá trị mặc định của cột là 5,60 $.
Để thêm cột, hãy chạy truy vấn sau:
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;
Lỗi sau xảy ra:
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'.
Giá trị được chỉ định cho tối thiểu_wages cột nhỏ hơn 5,6. Đó là lý do tại sao truy vấn trả lại lỗi.
Thay đổi giá trị của tối thiểu_wages giá trị và thực hiện lại truy vấn:
UPDATE tblemployee SET minimum_wages=5.8 WHERE employeeID =5;
Kết quả:
(1 row affected)
Completion time: 2020-12-14T17:22:40.8995851+05:30
Khi chúng tôi đã cập nhật bản ghi, hãy chạy truy vấn bên dưới để xem dữ liệu:
Select * from tblemployee where employeeID=5
Kết quả:
Để xác minh rằng ràng buộc mặc định đang hoạt động, hãy chạy câu lệnh INSERT sau:
USE codingsight
GO
INSERT INTO tblemployee (name, Address, PhoneNumber,deptID) VALUES ('Dilip Patel','Satyamev Famosa, Gandhinagar','9537021112',1)
Sau khi bản ghi được chèn, hãy để chúng tôi xem dữ liệu:
Truy vấn:
USE CodingSight
go
SELECT * FROM tblemployee t WHERE t.employeeID=25
Kết quả:
Tôi chưa chỉ định giá trị của tối thiểu_wages cột. Do đó, giá trị mặc định được chèn vào bảng.
Tóm tắt
Bài viết đã làm rõ bản chất của câu lệnh ALTER TABLE ADD COLUMN, cú pháp của nó và các trường hợp triển khai khác nhau.
Đọc thêm
Khái niệm cơ bản về câu lệnh SQL Server ALTER TABLE
Hiểu cột XÓA SQL khỏi bảng
Hiểu về BẢNG DROP NẾU TỒN TẠI Câu lệnh SQL