SQLのCREATE TABLEでテーブルの列にデフォルト値(DEFAULT)を設定する

SQLを使ってデータベースにテーブルを作成するには、CREATE TABLE文を使います。

データベースのテーブルを作成するSQL CREATE TABLE
SQL文では、既存のテーブルに対してINSERT、UPDATE、DELETEなどのステートメントを使用して、テーブルやビューのデータ(レコー...

CREATE TABLE文では、テーブルに作成する列の定義を記述します。

列の定義では最低限の情報として、列の名前とデータ型を指定すればテーブルが作成できます。

INSERT文でテーブルにレコード(データ)を挿入する際に、すべての列の値を必ず指定するのであれば、上記のように列の名前とデータ型のみを定義したテーブルでも問題ありません。
しかし、レコードを挿入する際に、一部の列の値のみを指定してINSERT文を実行すると、値を指定していない列の値はNULLになってします。

データベースには、値を指定せずにレコードを挿入した際に、あらかじめ決めておいた値を自動で設定してくれる仕組みが用意されています。

今回は、SQLのCREATE TABLE文でテーブルを作成する際に、列のデフォルト値を指定する方法について紹介します。

デフォルト値(既定値/初期値)を設定するテーブル

ここでは、デフォルト値を設定するための例を示すためのテーブルとして、会計伝票のデータを管理するテーブルの「伝票テーブル」があるとします。
伝票テーブルには「伝票番号」「日付」「科目(コード)」「入金額」「出金額」「摘要」の5つの列を用意します。

伝票テーブルの列定義

列名 データ型
伝票番号 int
日付 date
科目 varchar(5)
入金額 int
出金額 int
摘要 varchar(50)

伝票テーブルを作成するSQLのCREATE TABLE文

伝票テーブルを作成擦るCREATE TABLE文は次のようになります。

伝票テーブルにレコードを挿入するSQLのINSERT文

伝票テーブルのすべての列の値を指定してレコードを挿入するINSERT文は次のようになります。

上記のINSERT文を実行すると、次のようなレコードがテーブルに挿入されます。

伝票番号 日付 科目 入金額 出金額 摘要
1 2020/08/05 00100 0 100000 消耗品購入

上記のINSERT文では、伝票テーブルのすべての列に対する値をVALUES句で指定してますので、それぞれの値がすべてテーブルに登録されます。

次に、いくつかの列のみを指定した場合のINSERT文を考えてみます。
ここでは、「入金額」以外の値を指定する場合を例にあげます。

挿入されるレコード
伝票番号 日付 科目 入金額 出金額 摘要
2 2020/08/06 00200 NULL 100000 出金情報

上記のINSERT文では、入金額の列については値を指定していないので、NULLが登録されます。

ここで挿入するレコードは出金情報のため、入金額の情報が必要ないので省略していますが、システム的には入金額にNULLが登録されるのが好ましくないとします。
そこで、入金額が指定されていない場合は、NULLではなく「0」が登録されるようにします。(出金額も同様に「0」が登録されるようにします。)

このような場合にデータベースには、デフォルト値(既定値/初期値)を設定する仕組みが用意されています。

デフォルト値(既定値/初期値)を設定するDEFAULTキーワード

デフォルト値は、DEFAULTキーワードを列に指定することで設定できます。
DEFAULTキーワードは、各列のデータ型を定義している箇所の後ろにスペース文字列を入力し、その後に指定します。

DEFAULTキーワードを用いたCREATE TABLE文

以下に伝票テーブルの「入金額」と「出金額」にデフォルト値として「0」が設定されるようにするSQLを示します。

デフォルト値の指定は、DEFAULTキーワードを指定した後に、スペース文字列を入力し、省略時に設定される値を記述します。

上記のINSERTを実行した後で、入金額を省略したINSERT文を実行すると、結果は以下のようになります。

挿入されるレコード
伝票番号 日付 科目 入金額 出金額 摘要
2 2020/08/06 00200 0 100000 出金情報

上記の例では、DEFAULTキーワードで固定値(リテラル値)を指定しましたが、数式や関数などを設定することも可能です。
例えば、日付型の列に対してGETDATE()、CURRENT_DATE()、CURRENT_TIMESTAMP()、NOW()等の関数を指定することで、タイムスタンプとして使用することもできます。

DEFAULTキーワードを使用したデフォルト値の設定は、データが指定されなかった場合の既定値を定義することができるので、初期設定する値が決まっている場合は、設定しておくとバグを減らすことに役立ちます。
また、デフォルト値の設定は、システムの運用が始まった後でテーブルの定義が変更になった場合でも、既存のSQLが実行時エラーとならないようにするために重宝します。