データ型仕様の DEFAULT
句は、カラムのデフォルト値を示しています。例外が 1 つあります。デフォルト値は定数である必要があるので、関数または式にはできません。これは、たとえば日付カラムのデフォルト値に value
NOW()
や CURRENT_DATE
などの関数の値を設定できないことを意味します。例外では、CURRENT_TIMESTAMP
を、TIMESTAMP
および DATETIME
カラムのデフォルトとして指定できます。セクション11.3.5「TIMESTAMP および DATETIME の自動初期化および更新機能」を参照してください。
BLOB
および TEXT
カラムにはデフォルト値を割り当てられません。
カラム定義に明示的な DEFAULT
値が含まれていない場合、MySQL はデフォルト値を次のように特定します。
NULL
を値として取ることができる場合は、そのカラムは明示的な DEFAULT NULL
句で定義ができます。
NULL
を値として取ることができない場合は、MySQL は明示的な DEFAULT
句でカラムを定義できません。例外: カラムが PRIMARY KEY
の一部として定義されているが、NOT NULL
として明示的には定義されていない場合、MySQL はこれを NOT NULL
カラムとして作成します (PRIMARY KEY
カラムは NOT NULL
である必要があるので) が、暗黙的なデフォルト値を使用してこれに DEFAULT
句も割り当てます。これを防止するには、すべての PRIMARY KEY
カラムの定義に明示的な NOT NULL
を含めてください。
明示的な DEFAULT
句のない NOT NULL
カラムに対するデータエントリでは、INSERT
または REPLACE
ステートメントにカラムの値を含まれていない場合、または UPDATE
ステートメントがカラムを NULL
に設定する場合、MySQL はその時点で有効な SQL モードに従ってカラムを処理します。
厳密な SQL モードを有効にした場合、トランザクションテーブルに対してエラーが発生し、ステートメントがロールバックされます。非トランザクションテーブルではエラーが起きるが、これが複数行ステートメントの 2 行目以降の行に対するエラーの場合、先行する行が挿入されています。
厳密モードが有効でない場合、MySQL はカラムデータ型の暗黙的なデフォルト値にカラムを設定します。
テーブル t
が次のように定義されるとします。
CREATE TABLE t (i INT NOT NULL);
この場合、i
は明示的なデフォルトがないので、厳密モードでは次のそれぞれはステートメントはエラーになり、行は挿入されません。厳密モードを使用しない場合、3 番目のステートメントだけでエラーが発生します。最初の 2 つのステートメントでは暗黙のデフォルトが挿入されますが、DEFAULT(i)
が値を生成できないので 3 番目のステートメントは失敗します。
INSERT INTO t VALUES();
INSERT INTO t VALUES(DEFAULT);
INSERT INTO t VALUES(DEFAULT(i));
セクション5.1.7「サーバー SQL モード」を参照してください。
所定のテーブルに対して、SHOW CREATE TABLE
ステートメントを使用すると、どのカラムに明示的な DEFAULT
句があるかを確認できます。
暗黙的なデフォルトは次のように定義されます。
数値型のデフォルトは
0
です。ただし、例外としてAUTO_INCREMENT
属性で宣言された整数型または浮動小数点型のデフォルトは、そのシーケンスの次の値になります。TIMESTAMP
以外の日付と時間型のデフォルトには、「ゼロ」値が適切です。explicit_defaults_for_timestamp
システム変数が有効な場合、これはTIMESTAMP
にも当てはまります (セクション5.1.4「サーバーシステム変数」を参照してください)。それ以外の場合、テーブルの最初のTIMESTAMP
カラムのデフォルト値は現在の日付と時間になります。セクション11.3「日付と時間型」を参照してください。ENUM
ではない文字列型のデフォルト値は空の文字列です。ENUM
のデフォルトは、最初の列挙値です。
整数カラム定義の中の SERIAL DEFAULT VALUE
は NOT NULL AUTO_INCREMENT UNIQUE
のエイリアスです。