在本教程中,您將學習如何使用SQL更改或修改現(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 | | +--------------+-------------+------+-----+---------+----------------+
您可以使用以下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;