デフォルト値の設定
テーブルにデータを追加する時、カラムに値が指定されなかった場合にデフォルトで設定される値を指定します。書式は次の通りです。
CREATE TABLE db_name.tbl_name
(col_name1 data_type1 DEFAULT default_value, col_name2 data_type2, ...);
カラムのデータ型の後に「DEFAULT デフォルト値」を指定すると、データを追加する時にカラムに値が指定されなかった時のデフォルト値を設定できます。
デフォルト値として設定出来るのは定数だけです。関数などの戻り値をデフォルト値として設定することはできません。例外としてTIMESTAMP型のカラムにはCURRENT_TIMESTAMP関数が指定できます。これは後で確認します。
では実際に試してみます。次のようなテーブルを作成します。
mysql> create table defaulttest(num int default 0, -> str varchar(10) default '未入力');
作成したテーブルのカラム情報を確認します。
2つのカラムの「Default」列の値がそれぞれ設定した0と'未入力'になっていることが確認できます。
それではテーブルにデータを追加してみます。
mysql> insert into defaulttest(num) values(5);
まずは「num」カラムだけに値を指定してデータを追加しました。「str」カラムには値が設定されていませんのでデフォルト値である'未入力'が格納されます。
もう一つデータを追加してみます。
mysql> insert into defaulttest(str) values('東京都');
今度は「str」カラムだけに値を指定してデータを追加しましました。「num」カラムには値が設定されていませんのでデフォルト値である0が格納されます。
TIMESTAMP型
テーブルの中にTIMESTAMP型のカラムが含まれている場合、1つ目のTIMESTAMP型のカラムのデフォルト値はCURRENT_TIMESTAMP関数の戻り値が設定され、2つ目以降のTIMESTAMP型のカラムのデフォルト値には0('0000-00-00 00:00:00')が設定されます。(CURRENT_TIMESTAMP関数については「NOW関数(CURRENT_TIMESTAMP, LOCALTIME, LOCALTIMESTAMP関数)」を参照して下さい)。
ではテーブルを作成してみます。
mysql> create table tstest(ts1 timestamp, ts2 timestamp, ts3 timestamp);
作成したテーブルのカラム情報を確認します。
+-------+-----------+------+-----+---------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+---------------------+-----------------------------+ | ts1 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | | ts2 | timestamp | NO | | 0000-00-00 00:00:00 | | | ts3 | timestamp | NO | | 0000-00-00 00:00:00 | | +-------+-----------+------+-----+---------------------+-----------------------------+
複数のTIMESTAMP型のカラムがある場合、1つ目のカラムにだけCURRENT_TIMESTAMP関数が設定され、他のカラムは'0000-00-00 00:00:00'が設定されます。
1つのテーブル内でデフォルト値としてCURRENT_TIMESTAMP関数が設定できるTIMESTAMP型のカラムは1つだけです。その為、2つ目以降のTIMESTAMP型のカラムにデフォルト値としてCURRENT_TIMESTAMP関数を設定するとエラーが発生します。
では3つ目のカラムのデフォルト値として明示的にCURRENT_TIMESTAMP関数を設定してみます。
mysql> create table tstest2(ts1 timestamp, ts2 timestamp, -> ts3 timestamp default current_timestamp());
エラーが発生しました。もしも2つ目以降のTIMESTAMP型のカラムにデフォルト値としてCURRENT_TIMESTAMP関数を設定したい場合には、1つ目のTIMESTAMP型のカラムのデフォルト値に明示的に別の値を設定して下さい。
次の例では1つ目のカラムのデフォルト値として明示的に0を設定してみます。
mysql> create table tstest2(ts1 timestamp default 0, ts2 timestamp, -> ts3 timestamp default current_timestamp());
今度はエラーが発生せずテーブルが作成されました。では作成したテーブルのカラムの情報を取得してみます。
3つ目のカラムのデフォルト値がCURRENT_TIMESTAMP関数に設定されていることが確認できます。(なお明示的に他のカラムにCURRENT_TIMESTAMP関数を指定した場合には「on update CURRENT_TIMESTAMP」は自動で設定されません)。
( Written by Tatsuo Ikura )