English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、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;
以下の文はshippersテーブルに新しい列faxを追加しました。
ALTER TABLE shippers ADD fax VARCHAR(20);
現在、上記の文を実行した後、コマンド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 | +--------------+-------------+------+-----+---------+----------------+
注意:既存のテーブルに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では、テーブルを作成した後でも、テーブル内の既存列の位置に不満がある場合、以下の構文を使用していつでも変更できます:
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制約を追加してこの問題を解決します。制約を既存のテーブル列に追加する基本的な構文は以下の通りです:
ALTER TABLE table_name ADD UNIQUE (column_name,...);
以下のステートメントでは、UNIQUEをphone列に制約を追加します。
mysql> ALTER TABLE shippers ADD UNIQUE (phone);
このステートメントを実行した後、重複の電話番号をインサートしようとするとエラーメッセージを受け取ります。
同様に、あなたが作成したテーブルにPRIMARY KEYが無い場合、以下の内容を使用できます:
ALTER TABLE table_name ADD PRIMARY KEY (column_name,...);
未定義の場合、以下の文がPRIMARY KEY 制約がshipper_id列。
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文をサポートしていません。以下のように、列を変更するための代替のALTER子句をサポートしています:
ALTER TABLE table_name MODIFY column_name new_data_type;
以下の文は、shippersテーブルphone現在のデータ型がVARCHARからCHARに変更され、長さが20を15。
mysql> ALTER TABLE shippers MODIFY phone CHAR(15);
同様に、MySQLのテーブルの列にNULL値を許可するかどうかを切り替えるためにMODIFY子句を使用することができます。現在の列定義を再指定し、最後にnullまたはnot null制約を追加して、以下のようにします:
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> RENAME TABLE shippers TO shipper;