データ型仕様の DEFAULT
節は、カラムのデフォルト値を示しています。例外がひとつあります。デフォルト値は一定でなければいけませんので、それは関数や式にはなり得ません。これはたとえば、日付カラムの値に
value
NOW()
や
CURRENT_DATE
のような関数の値をデフォルトとして設定することはできないという意味です。例外として、TIMESTAMP
カラムのデフォルトとして
CURRENT_TIMESTAMP
を指定することができます。項6.3.1.1. 「TIMESTAMP
の特性」
を参照してください。
BLOB
と
TEXT
カラムはデフォルト値として指定することができません。
もしカラム定義が明示的な
DEFAULT
値を含まない場合、MySQL
はデフォルト値を次のように規定します。
もし NULL
を値として取ることができるなら、そのカラムは明示的な
DEFAULT NULL
節で定義することができます。
もし NULL
を値として取ることができなければ、MySQL
は明示的な DEFAULT
節でカラムを定義できません。データ入力に関しては、INSERT
または REPLACE
ステートメントにカラムの値が含まれていない場合、または
UPDATE
ステートメントでカラムが
NULL
に設定される場合、MySQL はその時点で有効な SQL
モードに従ってカラムを処理します。
もし厳密な SQL モードが有効でなければ、MySQL はカラムデータ型に暗黙のデフォルト値を設定します。
もし厳密モードが有効だと、トランザクションテーブルにエラーが起き、ステートメントがロールバックされます。非トランザクションテーブルではエラーが起きますが、これが複数行ステートメントの 2 行目以降の行に対するエラーだとすると、先行する行が挿入されています。
テーブル 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));
Server SQL Modes を参照してください。
与えられたテーブルに対して、どのカラムが明示的な
DEFAULT
節を持つかを確かめるために、SHOW
CREATE TABLE
ステートメントを利用することができます。
暗黙のデフォルトは次のように定義されます。
数値型のデフォルトは
0
です。ただし、例外として
AUTO_INCREMENT
属性で宣言された整数型または浮動小数点型のデフォルトはそのシーケンスの次の値になります。
TIMESTAMP
以外の日付と時刻型のデフォルトには、「ゼロ」値が適切です。テーブルの最初の
TIMESTAMP
カラムのデフォルト値は現在の日付けと時刻です。項6.3. 「日付と時刻型」
を参照してください。
ENUM
ではない文字列型のデフォルト値は空の文字列です。ENUM
のデフォルトは、最初の列挙値です。
整数カラム定義の中の SERIAL
DEFAULT VALUE
は NOT NULL
AUTO_INCREMENT UNIQUE
の別名です。