SQL 修改表(ALTER TABLE 語句)

在本教程中,您將學習如何使用SQL更改或修改現(xiàn)有表。

修改現(xiàn)有表

創(chuàng)建表后,很可能在您開始使用它時,可能會發(fā)現(xiàn)您忘記需要創(chuàng)建的列或約束,或者為該列指定了錯誤的名稱。

在這種情況下,您可以使用該ALTER TABLE語句通過添加,更改或刪除表中的列來更改或修改現(xiàn)有表。

考慮我們shippers的數(shù)據(jù)庫中有一個表,其結構如下:

+--------------+-------------+------+-----+---------+----------------+
| 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    |                |
+--------------+-------------+------+-----+---------+----------------+

我們將對所有ALTER table語句使用這個shippers表。

現(xiàn)在假設我們想要通過增加一列來擴展現(xiàn)有的shippers表。但是,問題是我們如何使用SQL命令來做到這一點?讓我們來看看。

添加新列

 將新列添加到現(xiàn)有表的基本語法:

ALTER TABLE table_name ADD column_name data_type constraints;					

下面的語句向shippers表添加了一個新的列fax。

ALTER TABLE shippers ADD fax VARCHAR(20);

現(xiàn)在,在執(zhí)行以上語句之后,如果您使用命令DESCRIBE shippers看到了表結構; 在MySQL命令行上,如下所示:

+--------------+-------------+------+-----+---------+----------------+
| 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    |                |
+--------------+-------------+------+-----+---------+----------------+

注意:如果要向現(xiàn)有表添加NOT NULL列,則必須指定顯式的默認值。此默認值用于為表中已經存在的每一行填充新列。

提示:在向表中添加新列時,如果既未指定NULL也未指定NOT NULL,則將該列視為已指定NULL。

MySQL默認在末尾添加新列。但是,如果要在特定列之后添加新列,可以使用以下AFTER子句:

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

MySQL首先提供了另一個子句,您可以使用該子句在表的第一個位置添加新列。只需將前面示例中的AFTER子句替換為FIRST,以便在shippers表的開頭添加列fax。

更改列位置

在MySQL中,如果您已經創(chuàng)建了一個表但對表中現(xiàn)有列的位置不滿意,則可以使用以下語法隨時對其進行更改:

ALTER TABLE table_name
  MODIFY column_name column_definition AFTER column_name;			

下面的語句將列fax放在shippers表中的shipper_name列之后。

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

添加約束

我們當前的shippers表存在一個主要問題。即使您插入具有重復電話號碼的記錄,也不會阻止您這樣做,這不好,電話號碼應該是唯一的。

您可以通過向phone列添加UNIQUE約束來解決此問題??梢酝ㄟ^以下方式將約束添加到現(xiàn)有表列的基本語法:

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

以下語句UNIQUE向phone列添加約束。

mysql> ALTER TABLE shippers ADD UNIQUE (phone);					

執(zhí)行此語句后,如果您嘗試插入重復的電話號碼,則會收到錯誤消息。

同樣,如果您創(chuàng)建的表中沒有PRIMARY KEY,則可以使用以下內容:

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

如果未定義,以下語句將PRIMARY KEY 約束添加到shipper_id列。

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

刪除列

從現(xiàn)有表中刪除列的基本語法:

ALTER TABLE table_name DROP COLUMN column_name;					

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

mysql> ALTER TABLE shippers DROP COLUMN fax;					

現(xiàn)在,執(zhí)行上面的語句后,如果您看到表結構,則如下所示:

+--------------+-------------+------+-----+---------+----------------+
| 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    |                |
+--------------+-------------+------+-----+---------+----------------+

更改列的數(shù)據(jù)類型

您可以使用以下ALTER子句在SQL Server中修改列的數(shù)據(jù)類型:

ALTER TABLE table_name ALTER COLUMN column_name new_data_type;					

但是MySQL數(shù)據(jù)庫服務器不支持ALTER COLUMN語法。它支持可用于修改列的備選修改子句,如下所示:

ALTER TABLE table_name MODIFY column_name new_data_type;					

以下語句將shippers表中phone列的當前數(shù)據(jù)類型從VARCHAR更改為CHAR,長度從20更改為15。

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

類似地,你可以使用MODIFY子句在MySQL表中的列是否允許空值之間進行切換,通過重新指定現(xiàn)有的列定義,并在最后添加null或not null約束,如下所示:

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

重命名表

在MySQL中重命名現(xiàn)有表的基本語法:

ALTER TABLE current_table_name RENAME new_column_name;					

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

mysql> ALTER TABLE shippers RENAME shipper;					

您還可以使用以下RENAME TABLE語句在MySQL中實現(xiàn)相同的目的:

mysql> RENAME TABLE shippers TO shipper;					
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清