データタイプ仕様の中の DEFAULT
条項はカラムのデフォルト値を表します。例外がひとつあります。デフォルト値は一定でなければいけませんので、それは関数や式にはなり得ません。これは例えば、日付カラムの値に
value
NOW()
や CURRENT_DATE
のような関数の値をデフォルトとして設定する事はできないという意味です。例外として、TIMESTAMP
カラムのデフォルトとして
CURRENT_TIMESTAMP
を指定する事ができます。項10.3.1.1. 「TIMESTAMP
MySQL 4.1での性質」を参照してください。
BLOB
と TEXT
カラムはデフォルト値として指定する事ができません。
もしカラム定義が 明示的な DEFAULT
値を含まない場合、MySQLはデフォルト値を次のように規定します。
もし NULL
を値として取る事ができるなら、そのカラムは明示的な
DEFAULT NULL
条項で定義する事ができます。
もし NULL
を値として取る事ができなければ、MySQLは明示的な
DEFAULT
条項でカラムを定義できません。データの入力に関しては、もし
INSERT
か REPLACE
ステートメントがカラムの値を含んでいなければ、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));
詳しくは 項4.2.6. 「SQL モード」 を参照してください。
与えられたテーブルに対して、どのカラムが明示的な
DEFAULT
条項を持つかを確かめる為に、 SHOW CREATE
TABLE
ステートメントを利用する事ができます。
暗黙のデフォルトは次のように定義されます。
AUTO_INCREMENT
属性で宣言された整数タイプ以外の数値タイプのデフォルトは
0
です。AUTO_INCREMENT
カラムのデフォルト値は、その配列の中の次の値です。
TIMESTAMP
以外の日付と時刻タイプのデフォルトには、「ゼロ」値が適切です。テーブルの最初の
TIMESTAMP
カラムのデフォルト値は現在の日付けと時刻です。項10.3. 「日付と時刻タイプ」を参照してください。
ENUM
ではない文字列タイプのデフォルト値は空の文字列です。ENUM
のデフォルトは、最初の列挙値です。