Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Hiểu SQL Server ALTER TABLE ADD COLUMN Statement

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:

  1. Thêm nhiều cột.
  2. Thêm một cột khóa chính mới.
  3. Thêm một cột khóa ngoại mới.
  4. Thêm các cột mới có các cột được tính toán.
  5. 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:

  1. 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 .
  2. 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.
  3. Chỉ định kiểu dữ liệu cột sau tên cột .
  4. 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, 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 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 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:

  1. Tên Cũ: tblCity - Tên mới: tblCity_Old.
  2. 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DB_NAME () so với ORIGINAL_DB_NAME () trong SQL Server:Sự khác biệt là gì?

  2. Lỗi máy chủ SQL 4104:Không thể liên kết số nhận dạng nhiều phần.

  3. Các tính năng hàng đầu cần tìm trong Công cụ giám sát máy chủ SQL

  4. Cách tốt nhất để phân trang kết quả trong SQL Server là gì

  5. Lấy tất cả các tên bảng của một cơ sở dữ liệu cụ thể bằng truy vấn SQL?