在本教程中,您將學(xué)習(xí)如何使用SQL更改或修改現(xiàn)有表。
創(chuàng)建表后,很可能在您開始使用它時(shí),可能會(huì)發(fā)現(xiàn)您忘記需要?jiǎng)?chuàng)建的列或約束,或者為該列指定了錯(cuò)誤的名稱。
在這種情況下,您可以使用該ALTER TABLE語句通過添加,更改或刪除表中的列來更改或修改現(xiàn)有表。
考慮我們shippers的數(shù)據(jù)庫中有一個(gè)表,其結(jié)構(gòu)如下:
+--------------+-------------+------+-----+---------+----------------+ | 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 | | +--------------+-------------+------+-----+---------+----------------+
我們將對(duì)所有ALTER table語句使用這個(gè)shippers表。
現(xiàn)在假設(shè)我們想要通過增加一列來擴(kuò)展現(xiàn)有的shippers表。但是,問題是我們?nèi)绾问褂肧QL命令來做到這一點(diǎn)?讓我們來看看。
將新列添加到現(xiàn)有表的基本語法:
ALTER TABLE table_name ADD column_name data_type constraints;
下面的語句向shippers表添加了一個(gè)新的列fax。
ALTER TABLE shippers ADD fax VARCHAR(20);
現(xiàn)在,在執(zhí)行以上語句之后,如果您使用命令DESCRIBE shippers看到了表結(jié)構(gòu); 在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列,則必須指定顯式的默認(rèn)值。此默認(rèn)值用于為表中已經(jīng)存在的每一行填充新列。
提示:在向表中添加新列時(shí),如果既未指定NULL也未指定NOT NULL,則將該列視為已指定NULL。
MySQL默認(rèn)在末尾添加新列。但是,如果要在特定列之后添加新列,可以使用以下AFTER子句:
mysql> ALTER TABLE shippers ADD fax VARCHAR(20) AFTER shipper_name;
MySQL首先提供了另一個(gè)子句,您可以使用該子句在表的第一個(gè)位置添加新列。只需將前面示例中的AFTER子句替換為FIRST,以便在shippers表的開頭添加列fax。
在MySQL中,如果您已經(jīng)創(chuàng)建了一個(gè)表但對(duì)表中現(xiàn)有列的位置不滿意,則可以使用以下語法隨時(shí)對(duì)其進(jì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;
我們當(dāng)前的shippers表存在一個(gè)主要問題。即使您插入具有重復(fù)電話號(hào)碼的記錄,也不會(huì)阻止您這樣做,這不好,電話號(hào)碼應(yīng)該是唯一的。
您可以通過向phone列添加UNIQUE約束來解決此問題??梢酝ㄟ^以下方式將約束添加到現(xiàn)有表列的基本語法:
ALTER TABLE table_name ADD UNIQUE (column_name,...);
以下語句UNIQUE向phone列添加約束。
mysql> ALTER TABLE shippers ADD UNIQUE (phone);
執(zhí)行此語句后,如果您嘗試插入重復(fù)的電話號(hào)碼,則會(huì)收到錯(cuò)誤消息。
同樣,如果您創(chuàng)建的表中沒有PRIMARY KEY,則可以使用以下內(nèi)容:
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í)行上面的語句后,如果您看到表結(jié)構(gòu),則如下所示:
+--------------+-------------+------+-----+---------+----------------+ | 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ù)庫服務(wù)器不支持ALTER COLUMN語法。它支持可用于修改列的備選修改子句,如下所示:
ALTER TABLE table_name MODIFY column_name new_data_type;
以下語句將shippers表中phone列的當(dāng)前數(shù)據(jù)類型從VARCHAR更改為CHAR,長(zhǎng)度從20更改為15。
mysql> ALTER TABLE shippers MODIFY phone CHAR(15);
類似地,你可以使用MODIFY子句在MySQL表中的列是否允許空值之間進(jìn)行切換,通過重新指定現(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中實(shí)現(xiàn)相同的目的:
mysql> RENAME TABLE shippers TO shipper;