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
列到現有表,則必須指定顯式預設值。此預設值用於為表中已存在的每一行填充新列。
提示: 向表中新增新列時,如果既未指定也 NULL
未 NOT NULL
指定,則將列視為已指定 NULL
。
MySQL 預設在末尾新增新列。但是,如果要在特定列之後新增新列,則可以使用 AFTER
子句,如下所示:
mysql> ALTER TABLE shippers ADD fax VARCHAR ( 20 ) AFTER shipper_name;
MySQL 提供了另一個子句 FIRST
,你可以使用該子句在表中的第一個位置新增新列。只需替換上一個示例中的子句 AFTER
為 FIRST
,即可在 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
子句通過重新指定現有列定義並在末尾新增 NULL
或 NOT 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;