SQL ALTER TABLE 語句

在本教程中,你將學習如何使用 SQL 更改或修改現有表。

修改現有表

很有可能在建立表後,當你開始使用它時,你可能會發現你忘記提及任何列或約束或為列指定了錯誤的名稱。

在這種情況下,你可以使用 ALTER TABLE 語句通過新增、更改或刪除表中的列來更改現有表。

考慮我們的資料庫中有一個 *shippers * 表,其結構如下:

+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| shipper_id   | int         | NO   | PRI | NULL    | auto_increment |
| shipper_name | varchar(60) | NO   |     | NULL    |                |
| phone        | varchar(60) | NO   |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+

我們將把這個 shippers 表用於我們的所有 ALTER TABLE 語句例子。

現在假設我們想通過再新增一列來擴充套件現有的 shippers 表。但問題是我們如何使用 SQL 命令來做到這一點? 好吧,讓我們找出答案。

新增新列

可以使用以下方法給出將新列新增到現有表的基本語法:

ALTER TABLE table_name ADD column_name data_type constraints ; 

以下語句將新的列 fax 新增到 shippers 表。

ALTER TABLE shippers ADD fax VARCHAR(20);

現在,你執行上述語句後如果你在 MySQL 命令列上使用 DESCRIBE shippers; 命令看到表結構,它看起來如下:

+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| shipper_id   | int         | NO   | PRI | NULL    | auto_increment |
| shipper_name | varchar(60) | NO   |     | NULL    |                |
| phone        | varchar(60) | NO   |     | NULL    |                |
| fax          | varchar(20) | YES  |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+

注意: 如果要新增 NOT NULL 列到現有表,則必須指定顯式預設值。此預設值用於為表中已存在的每一行填充新列。

提示: 向表中新增新列時,如果既未指定也 NULLNOT NULL 指定,則將列視為已指定 NULL

MySQL 預設在末尾新增新列。但是,如果要在特定列之後新增新列,則可以使用 AFTER 子句,如下所示:

mysql> ALTER TABLE shippers ADD fax VARCHAR ( 20 ) AFTER shipper_name; 

MySQL 提供了另一個子句 FIRST ,你可以使用該子句在表中的第一個位置新增新列。只需替換上一個示例中的子句 AFTERFIRST ,即可在 shippers 表的開頭新增列 fax

更改列位置

在 MySQL 中,如果你已經建立了一個表但對錶中的現有列位置不滿意,則可以使用以下語法隨時更改它:

ALTER TABLE table_name MODIFY column_name column_definition AFTER column_name ; 

以下語句將 shipper_name 列之後的列 fax 放在 shippers 表中。

mysql> ALTER TABLE shippers MODIFY fax VARCHAR ( 20 ) AFTER shipper_name; 

新增約束

我們目前的 shippers 表有一個主要問題。如果你插入帶有重複電話號碼的記錄,它不會阻止你這樣做,這不好,它應該是唯一的。

你可以通過向電話列新增約束 UNIQUE 來解決此問題。將此約束新增到現有表列的基本語法可以通過以下方式給出:

ALTER TABLE table_name ADD UNIQUE ( column_name ,...); 

以下語句向 phone 列新增 UNIQUE 約束。

mysql> ALTER TABLE shippers ADD UNIQUE (phone); 

如果你嘗試插入重複的電話號碼,執行此語句後,你將收到錯誤訊息。

同樣,如果你建立了一個沒有 PRIMARY KEY 的表,你可以新增一個:

ALTER TABLE table_name ADD PRIMARY KEY ( column_name ,...); 

如果未定義,則以下語句將向 shipper_id 列新增 PRIMARY KEY 約束。

mysql> ALTER TABLE shippers ADD PRIMARY KEY (shipper_id); 

刪除列

從現有表中刪除列的基本語法可以通過以下方式給出:

ALTER TABLE table_name DROP COLUMN column_name ; 

以下語句從 shippers 表中刪除我們新新增的列 fax

mysql> ALTER TABLE shippers DROP COLUMN fax; 

現在,如果你看到表結構,執行上述語句後,它看起來如下:

+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| shipper_id   | int         | NO   | PRI | NULL    | auto_increment |
| shipper_name | varchar(60) | NO   |     | NULL    |                |
| phone        | varchar(20) | NO   | UNI | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+

更改列的資料型別

你可以使用以下 ALTER 子句修改 SQL Server 中列的資料型別,如下所示:

ALTER TABLE table_name ALTER COLUMN column_name new_data_type ; 

但是 MySQL 資料庫伺服器不支援 ALTER COLUMN 語法,但它支援 MODIFY 子句,你可以使用它來修改列,如下所示:

ALTER TABLE table_name MODIFY column_name new_data_type ; 

下面的語句改變 shippers 表中 phone 列的資料型別從 VARCHAR 更改到 CHAR,長度從 20 變為 15。

mysql> ALTER TABLE shippers MODIFY phone CHAR ( 15 ); 

類似地,你可以使用 MODIFY 子句通過重新指定現有列定義並在末尾新增 NULLNOT NULL 約束來切換 MySQL 表中的列是否應該允許空值,如下所示:

mysql> ALTER TABLE shippers MODIFY shipper_name CHAR ( 15 ) NOT NULL ; 

重新命名錶

在 MySQL 中重新命名現有表的基本語法可以通過以下方式給出:

ALTER TABLE current_table_name RENAME new_column_name ; 

以下語句重新命名我們的 shippers 表為 shipper

mysql> ALTER TABLE shippers RENAME shipper; 

你也可以使用 RENAME TABLE 語句在 MySQL 中實現相同的功能,如下所示:

mysql> RENAME TABLE shippers TO shipper;