DEFAULT制約(カラムにデフォルト値を設定する)
テーブルを作成するときにカラムに DEFAULT 制約をつけることでカラムにデフォルトの値を設定することができます。データを追加したとき、対象のカラムに値を指定しなかった場合にはデフォルト値がカラムに格納されます。ここでは MySQL における DEFAULT 制約の使い方について解説します。
(Last modified: )
DEFAULT 制約の使い方
テーブルを作成するときにカラムに対して DEFAULT 制約を付けることができます。書式は次の通りです。
CREATE TABLE db_name.tbl_name (col_name data_type [DEFAULT {literal | (expr)}], ...)
カラムのデータ型のあとに DEFAULT 定数 と記述することでカラムにデフォルトの値を設定できます。テーブルにデータを追加するとき、すべてのカラムに値を指定する必要はありませんが、デフォルト値が設定されているカラムに値が指定されなかった時にデフォルト値に設定された定数が格納されます。
以前のバージョンではデフォルト値に定数以外で指定できるのは NOW() 、 CURRENT_DATE() 、 CURRENT_TIMESTAMP() の3つだけでしたが、 MySQL 8.0.13 以降では定数の他に組み込み関数や演算子を指定することができます。定数以外を指定する場合は括弧()で囲むことで値と区別します。
CREATE TABLE hoge ( num1 int default 10, str1 varchar(10) default 'Hello', num2 float default (rand() + 3.2), d date default (CURRENT_DATE) );
では実際に試してみます。次のようなテーブルを作成しました。 old カラムと name カラムにはそれぞれ DEFAULT 制約が設定されています。
create table friends(old int default 0, name varchar(10) default 'No Name');
作成したテーブルのカラム情報を確認します。
show columns from friends;
Default カラムの値をみていただくと、 old カラムが 0 、 name カラムが No Name となっています。
テーブルにデータを 3 つ追加します。
insert into friends values(28, 'Yamada');
insert into friends(old) values(34);
insert into friends(name) values('Suzuki');
追加したデータをテーブルから取得してみます。
select * from friends;
1 つ目のデータは old カラムと name カラムにそれぞれ値を指定してデータを追加しています。データを追加する時に値が指定されていればその値が格納されます。 2 つ目のデータは old カラムにだけ値を指定してデータを追加しています。 name カラムに値が指定されていないのでデフォルト値に設定された 'No Name' が格納されています。 3 つ目のデータは name カラムにだけ値を指定してデータを追加しています。 old カラムに値が指定されていないのでデフォルト値に設定された 0 が格納されています。
このようにカラムにデフォルト値が設定されている場合、データを追加した時にカラムに値が指定されていないとデフォルト値が格納されます。
デフォルト値を使ってデータを追加する
データを追加するには INSERT 文を使用します。 INSERT 文はすべてのカラムに値を指定してデータを追加することもできますし、特定のカラムだけに値を指定してデータを追加することもできます。特定のカラムだけに値を指定した場合、値が指定されなかったカラムにデフォルト値が設定されていれば、データを追加する時にデフォルト値が使用されます。( INSERT 文については「データを追加する(INSERT文)」を参照されてください)。
なおすべてのカラムの値を指定せずにデータを追加する場合は次のように記述します。
insert into friends() values();
この場合、すべてのカラムの値がデフォルト値を使用してデータが追加されます。
また INSERT 文を使ってデータを追加する時に、デフォルト値を使用したいカラムには DEFAULT と記述するとカラムに設定されているデフォルト値が格納されます。例えば次のように記述します。
insert into friends values(31, DEFAULT);
これは次のように記述した場合と同じ結果となります。
insert into friends(old) values(31);
実際に試してみると name カラムにはデフォルト値が格納されています。
デフォルト値に組み込み関数や演算子を使用する
MySQL 8.0.13 以降であればデフォルト値に組み込み関数や演算子を使用できるようになりました。実際に試してみるために次のようなテーブルを作成しました。 各カラムにはそれぞれ DEFAULT 制約が設定されています。
create table sample(id int default 0, num float default (rand() * 10), t time default (now()));
作成したテーブルのカラム情報を確認します。
show columns from sample;
Default カラムの値をみていただくと、 id カラムが 0 、 num カラムが (rand() * 10) 、 t カラムが now() となっています。またデフォルト値として定数ではない値が設定されているカラムには Extra カラムのところに DEFAULT_GENERATED と表示されています。
すべてのカラムの値をデフォルト値を使うようにしてデータを 3 つ追加してみます。(少し時間を空けながら同じ INSERT 文を 3 回実行しています)。
insert into sample() values();
追加したデータをテーブルから取得してみます。
select * from sample;
追加されたデータを確認すると、 num カラムには RAND() 関数を使って 0.0 から 1.0 までの間のランダムな値を取得したあと 10倍 された値がデフォルト値として格納されています。また t カラムにはデータを追加した時の時刻を取得してデフォルト値として格納されています。
このようにデフォルト値には定数だけではなく組み込み関数や演算子を使った結果などを設定することができます。
DEFAULT 制約が設定されていないカラムのデフォルト値
DEFAULT 制約を設定することでカラムにデフォルトの値を設定することができますが、 DEFAULT 制約が設定されていないカラムのデフォルト値を確認しておきます。次のようなテーブルを作成しました。
create table sample(n1 int, n2 float, s varchar(10), d date);
作成したテーブルのカラム情報を確認します。
show columns from sample;
Default カラムの値をみていただくとそれぞれのカラムのデフォルト値が NULL となっています。このように DEFAULT 制約を設定していないカラムのデフォルト値は NULL となるようです。
すべてのカラムの値をデフォルト値を使うようにしてデータを追加し、そのあとでテーブルからデータを取得して確認してみます。
insert into sample() values();
すべてのカラムに NULL が格納されていることが確認できました。
-- --
DEFAULT 制約の使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
プログラミングや開発環境構築の解説サイトを運営しています。