Trong SQL, ALTER TABLE
câu lệnh sửa đổi định nghĩa của một bảng hiện có.
Bạn có thể sử dụng ALTER TABLE
để thay đổi, thêm hoặc bỏ các cột và ràng buộc.
Tùy thuộc vào DBMS của bạn, ALTER TABLE
câu lệnh cũng có thể được sử dụng để gán lại và xây dựng lại các phân vùng hoặc vô hiệu hóa và bật các ràng buộc và trình kích hoạt.
Cú pháp
ALTER TABLE
tuyên bố thường như sau:
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
Ở đâu:
-
table_name
là tên của bảng bạn muốn thay đổi. -
[alter_option [, alter_option] …]
là danh sách các thay đổi cụ thể mà bạn muốn thực hiện (ví dụ:ADD
theo sau là tên và định nghĩa cột hoặcDROP COLUMN
theo sau là tên cột, v.v.). -
[partition_options]
là một danh sách tùy chọn các tùy chọn dành riêng cho các bảng được phân vùng. Không phải tất cả các DBMS đều hỗ trợ các bảng được phân vùng. Nếu có, các tùy chọn như vậy có thể cho phép bạn thêm, bỏ, loại bỏ, nhập, hợp nhất hoặc chia nhỏ các phân vùng hoặc thực hiện bảo trì phân vùng.
Cú pháp đầy đủ cho ALTER TABLE
có thể khá phức tạp và thay đổi đáng kể giữa các DBMS. Đối với bất kỳ điều gì không được đề cập trong bài viết này, hãy tham khảo tài liệu DBMS của bạn.
Dưới đây là các ví dụ về ALTER TABLE
phổ biến nhất các hoạt động.
Thêm một cột mới
Để thêm cột mới vào bảng, hãy sử dụng ADD
, theo sau là tên cột và kiểu dữ liệu.
ALTER TABLE Products
ADD ProductDescription varchar(500);
Điều này thêm một cột mới có tên là ProductDescription
tới Products
bảng.
Trong ví dụ này, chúng tôi đặt cột là varchar(500)
nhưng bạn sẽ sử dụng bất kỳ kiểu dữ liệu nào thích hợp cho cột mới của mình.
Bạn cũng có thể bao gồm các ràng buộc trong định nghĩa cột của mình, nhưng điều này có thể phụ thuộc vào DBMS của bạn và bảng đã chứa dữ liệu hay chưa (xem thảo luận bên dưới về điều này).
Đổi tên cột
Hầu hết các RDBMS chính (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) cho phép bạn đổi tên một cột như sau:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
Nếu bạn đang sử dụng MySQL trước phiên bản 8.0 hoặc MariaDB trước 10.5.2+, bạn sẽ cần sử dụng CHANGE COLUMN
thay vào đó, cú pháp cũng yêu cầu bạn xác định lại kiểu dữ liệu. Như thế này:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
Trong SQL Server, bạn sẽ cần sử dụng sp_rename
thủ tục được lưu trữ để đổi tên một cột. Như thế này:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
Thả một cột
Để thả một cột, hãy sử dụng DROP COLUMN
, theo sau là tên cột.
ALTER TABLE table_name
DROP COLUMN column_name;
Sửa đổi Định nghĩa của Cột
Cú pháp để sửa đổi định nghĩa của cột hiện có khác nhau đáng kể giữa các DBMS. Nó cũng phụ thuộc vào những sửa đổi bạn cần thực hiện.
Để giữ mọi thứ đơn giản, hãy thực hiện một sửa đổi đơn giản đối với một cột trong SQL Server:
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
Trong ví dụ này, chúng tôi đã thay đổi ProductDescription
cột từ varchar(500)
thành varchar(1000)
.
Phần dưới đây trình bày cú pháp cơ bản mà mỗi DBMS yêu cầu để thực hiện các thay đổi tương tự hoặc tương tự.
Máy chủ SQL:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
PostgreSQL:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
MySQL, MariaDB và Oracle trước 10g:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
Trong Oracle 10g trở lên:
ALTER TABLE table_name
MODIFY column_name datatype;
SQLite sẽ không cho phép bạn sửa đổi một cột, ngoài việc đổi tên nó.
Cú pháp thực tế cho mỗi DBMS thường phức tạp hơn nhiều so với cú pháp này và phụ thuộc vào chính xác những gì bạn đang cố gắng thực hiện. Tuy nhiên, điều này sẽ giúp bạn bắt đầu với các sửa đổi cột cơ bản.
Hạn chế &Cân nhắc
Nói chung, bạn nên tránh thực hiện các sửa đổi đối với các bảng khi chúng chứa dữ liệu. Bằng cách thực hiện các thay đổi, bạn có nguy cơ mất dữ liệu hiện có.
Phải nói rằng, nhiều DBMS thực sự ngăn bạn thực hiện các thay đổi nhất định sau khi bảng chứa dữ liệu. Ví dụ:bạn có thể thấy rằng bạn không thể thêm NOT NULL
ràng buộc đối với một cột chứa dữ liệu.
Một số DBMS có thể cho phép bạn làm như vậy, miễn là bạn sử dụng DEFAULT
ràng buộc (để cung cấp giá trị mặc định cho các cột chưa có dữ liệu được chèn rõ ràng vào chúng) hoặc cột Danh tính / tự động gia tăng hoặc cột dấu thời gian, v.v.
Một số DBMS không cho phép bạn bỏ hoặc thay đổi các cột trong bảng.
Ngoài ra, một số DBMS hạn chế các kiểu dữ liệu có thể được thêm vào.
Ví dụ - Thêm Ràng buộc KHÔNG ĐẦY ĐỦ
Dưới đây là một ví dụ để giúp chứng minh những điểm trên.
Đây là những gì sẽ xảy ra khi tôi cố gắng thêm một cột có NOT NULL
ràng buộc trong SQL Server.
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL;
Kết quả:
Msg 4901, Level 16, State 1, Line 1 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, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'ProductDescription' cannot be added to non-empty table 'Products' because it does not satisfy these conditions.
Về cơ bản, bảng đã chứa dữ liệu và do đó, SQL Server trả về một lỗi cho tôi biết rằng tôi chỉ có thể thêm một NOT NULL
ràng buộc nếu bảng đáp ứng các tiêu chí nhất định và nó chưa đáp ứng tiêu chí đó.
Và có lý do chính đáng cho tiêu chí đó.
A NOT NULL
ràng buộc đảm bảo rằng không có NULL
giá trị trong cột trong bất kỳ hàng nào. Vấn đề là, chúng tôi đã có dữ liệu trong bảng và nếu chúng tôi thêm một cột mới, các hàng hiện có đó sẽ là NULL
- sẽ vi phạm ngay lập tức NOT NULL
của chúng tôi hạn chế. Vì vậy, chúng tôi cần chỉ định dữ liệu để chuyển vào các hàng hiện có.
Để thực hiện việc này, chúng ta có thể thêm DEFAULT
hoặc tương tự để đảm bảo rằng mọi hàng hiện có đều được tự động điền dữ liệu trong cột này.
Ví dụ:
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
Điều này chỉ đơn giản là thêm một DEFAULT
ràng buộc vào cột. Ràng buộc này đảm bảo rằng tất cả các hàng đều chứa một giá trị (trong trường hợp này, giá trị là N/A
) nếu chúng chưa được chỉ định một giá trị. Điều này có nghĩa là NOT NULL
của chúng tôi ràng buộc sẽ không bị vi phạm, bởi vì tất cả các hàng hiện có bây giờ sẽ chứa một giá trị.
Nếu cột mới cần có các giá trị tăng dần, duy nhất, thay vào đó bạn có thể đặt nó thành IDENTITY
cột (hoặc AUTOINCREMENT
trong SQLite và các DBMS khác).
Tuy nhiên, nếu bảng chưa chứa dữ liệu, bạn có thể thêm cột mà không phải thực hiện bất kỳ bước nào trong số này.
Tùy chọn phân vùng
Bài viết này hướng tới người mới bắt đầu và các bảng được phân vùng hơi nằm ngoài phạm vi hướng dẫn của người mới bắt đầu.
Đã nói rằng, tôi sẽ nhanh chóng xem qua một số tùy chọn phân vùng liên quan đến ALTER TABLE
tuyên bố.
Nếu DBMS của bạn hỗ trợ các bảng được phân vùng, nó có thể cũng cung cấp các tùy chọn phân vùng với ALTER TABLE
tuyên bố.
Ví dụ, trong MySQL, bạn có thể làm như sau:
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
Điều này phân chia bảng thành 8 phân vùng, bằng HASH
, sử dụng ProductId
làm khóa phân vùng.
PARTITION BY HASH
sử dụng phần còn lại của biểu thức (trong trường hợp này là ProductId
cột) chia cho số lượng phân vùng (tức là mô đun).
Bạn cũng có thể sử dụng phân vùng phạm vi. Đây là cách bạn có thể thêm phân vùng phạm vi vào bảng hiện có:
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
Ví dụ này ngụ ý rằng Products
bảng đã có 8 phân vùng phạm vi và chúng tôi đang thêm một phân vùng khác có tên là Partition9
.
Bạn có thể thả các phân vùng như sau:
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
Hãy nhớ rằng những ví dụ này dành cho MySQL.
Tôi cũng đã viết một vài bài báo về các bảng được phân vùng trong SQL Server. Liên quan đến ALTER TABLE
, đây là cách chuyển đổi một phân vùng và đây là cách chuyển đổi trong một phân vùng (cả hai đều được thực hiện với ALTER TABLE
).
Trong SQL Server, một số tùy chọn phân vùng cần được thực hiện với các câu lệnh khác. Ví dụ:hợp nhất các phân vùng được thực hiện với ALTER PARTITION FUNCTION
và việc phân chia các phân vùng được thực hiện với ALTER PARTITION SCHEME
tuyên bố.
Nếu bạn muốn tìm hiểu thêm về các bảng được phân vùng trong SQL Server, đây là cách tạo một bảng được phân vùng trong SQL Server.
ALTER TABLE
trong SQLite
Tôi cũng nên đề cập rằng SQLite hỗ trợ ALTER TABLE
rất hạn chế tuyên bố. Trong SQLite, ALTER TABLE
câu lệnh cho phép bạn đổi tên bảng, đổi tên cột trong bảng hoặc thêm cột mới vào bảng hiện có.
Bất kỳ thay đổi nào khác sẽ yêu cầu bạn bỏ bảng và bắt đầu lại. Điều này cũng áp dụng cho việc thêm khóa ngoại.