データ型指定には、明示的または暗黙的なデフォルト値を指定できます。
データ型指定の DEFAULT
句は、カラムのデフォルト値を明示的に示します。 例:
value
CREATE TABLE t1 (
i INT DEFAULT -1,
c VARCHAR(10) DEFAULT '',
price DOUBLE(16,2) DEFAULT 0.00
);
SERIAL DEFAULT VALUE
は特殊なケースです。 整数カラムの定義では、これは NOT NULL AUTO_INCREMENT UNIQUE
のエイリアスです。
明示的な DEFAULT
句の処理の一部の側面は、次に説明するように、バージョンに依存します。
DEFAULT
句で指定されるデフォルト値は、リテラル定数または式です。 例外として、式のデフォルト値をカッコで囲み、リテラル定数のデフォルト値と区別します。 例:
CREATE TABLE t1 (
-- literal defaults
i INT DEFAULT 0,
c VARCHAR(10) DEFAULT '',
-- expression defaults
f FLOAT DEFAULT (RAND() * RAND()),
b BINARY(16) DEFAULT (UUID_TO_BIN(UUID())),
d DATE DEFAULT (CURRENT_DATE + INTERVAL 1 YEAR),
p POINT DEFAULT (Point(0,0)),
j JSON DEFAULT (JSON_ARRAY())
);
ただし、TIMESTAMP
カラムおよび DATETIME
カラムの場合は、カッコを囲まずに CURRENT_TIMESTAMP
関数をデフォルトとして指定できます。 セクション11.2.5「TIMESTAMP および DATETIME の自動初期化および更新機能」を参照してください。
BLOB
, TEXT
, GEOMETRY
および JSON
データ型にデフォルト値を割り当てることができるのは、式の値がリテラルの場合でも、値が式として書き込まれる場合のみです:
-
これは許可されています (式として指定されたリテラルのデフォルト):
CREATE TABLE t2 (b BLOB DEFAULT ('abc'));
-
これにより、エラーが生成されます (リテラルのデフォルトが式として指定されていません):
CREATE TABLE t2 (b BLOB DEFAULT 'abc');
式のデフォルト値は、次のルールに従う必要があります。 許可されていない構造が式に含まれている場合は、エラーが発生します。
リテラル、組込み関数 (決定的および非決定的の両方)、および演算子が許可されます。
サブクエリー、パラメータ、変数、ストアドファンクションおよびユーザー定義関数は使用できません。
式のデフォルト値は、
AUTO_INCREMENT
属性を持つカラムに依存できません。-
あるカラムの式のデフォルト値は他のテーブルのカラムを参照できますが、生成されたカラムまたは式のデフォルト値を持つカラムへの参照は、テーブル定義の前半で発生したカラムにする必要があります。 つまり、式のデフォルト値には、生成されたカラムまたは式のデフォルト値を持つカラムへのフォワード参照を含めることはできません。
順序付け制約は、
ALTER TABLE
を使用してテーブルのカラムを並べ替える場合にも適用されます。 結果のテーブルに、式のデフォルト値を持つ生成されたカラムまたはカラムへのフォワード参照を含む式のデフォルト値が含まれる場合、ステートメントは失敗します。
式のデフォルト値のいずれかのコンポーネントが SQL モードに依存している場合、すべての使用中に SQL モードが同じでないかぎり、テーブルの使用方法によって異なる結果が発生する可能性があります。
CREATE TABLE ... LIKE
および CREATE TABLE ... SELECT
の場合、宛先テーブルには元のテーブルの式のデフォルト値が保持されます。
式のデフォルト値が非決定的関数を参照している場合、式を評価するステートメントはステートメントベースレプリケーションでは安全ではありません。 これには、INSERT
や UPDATE
などのステートメントが含まれます。 この場合、バイナリロギングが無効になっていると、ステートメントは通常どおりに実行されます。 バイナリロギングが有効で、binlog_format
が STATEMENT
に設定されている場合、ステートメントはログに記録されて実行されますが、レプリケーションスレーブが相違する可能性があるため、警告メッセージがエラーログに書き込まれます。 binlog_format
が MIXED
または ROW
に設定されている場合、ステートメントは通常どおりに実行されます。
新しい行を挿入する場合、式 default を持つカラムのデフォルト値を挿入するには、カラム名を省略するか、カラムを DEFAULT
として指定します (リテラル default を持つカラムの場合と同様):
mysql> CREATE TABLE t4 (uid BINARY(16) DEFAULT (UUID_TO_BIN(UUID())));
mysql> INSERT INTO t4 () VALUES();
mysql> INSERT INTO t4 () VALUES(DEFAULT);
mysql> SELECT BIN_TO_UUID(uid) AS uid FROM t4;
+--------------------------------------+
| uid |
+--------------------------------------+
| f1109174-94c9-11e8-971d-3bf1095aa633 |
| f110cf9a-94c9-11e8-971d-3bf1095aa633 |
+--------------------------------------+
ただし、名前付きカラムのデフォルト値を指定するための DEFAULT(
の使用は、リテラルのデフォルト値を持つカラムにのみ許可され、式のデフォルト値を持つカラムには許可されません。
col_name
)
すべてのストレージエンジンが式のデフォルト値を許可するわけではありません。 そうでない場合は、ER_UNSUPPORTED_ACTION_ON_DEFAULT_VAL_GENERATED
エラーが発生します。
デフォルト値が宣言されたカラム型とは異なるデータ型に評価された場合、宣言された型への暗黙的な強制は、通常の MySQL 型変換ルールに従って行われます。 セクション12.3「式評価での型変換」を参照してください。
例外として、DEFAULT
句で指定されるデフォルト値はリテラル定数である必要があります。関数または式は使用できません。 これは、たとえば日付カラムのデフォルト値に NOW()
や CURRENT_DATE
などの関数の値を設定できないことを意味します。 ただし、TIMESTAMP
カラムおよび DATETIME
カラムの場合は、CURRENT_TIMESTAMP
をデフォルトとして指定できます。 セクション11.2.5「TIMESTAMP および DATETIME の自動初期化および更新機能」を参照してください。
BLOB
, TEXT
, GEOMETRY
および JSON
データ型にデフォルト値を割り当てることはできません。
デフォルト値が宣言されたカラム型とは異なるデータ型に評価された場合、宣言された型への暗黙的な強制は、通常の MySQL 型変換ルールに従って行われます。 セクション12.3「式評価での型変換」を参照してください。
データ型指定に明示的な DEFAULT
値が含まれていない場合、MySQL は次のようにデフォルト値を決定します:
NULL
を値として取ることができる場合は、そのカラムは明示的な DEFAULT NULL
句で定義ができます。
カラムが値として NULL
を取ることができない場合、MySQL は明示的な DEFAULT
句を使用せずにカラムを定義します。
明示的な 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.11「サーバー SQL モード」を参照してください。
特定のテーブルについて、SHOW CREATE TABLE
ステートメントは明示的な DEFAULT
句を持つカラムを表示します。
暗黙的なデフォルトは次のように定義されます。
数値型のデフォルトは
0
です。ただし、例外としてAUTO_INCREMENT
属性で宣言された整数型または浮動小数点型のデフォルトは、そのシーケンスの次の値になります。TIMESTAMP
以外の日付と時間型のデフォルトには、「ゼロ」値が適切です。explicit_defaults_for_timestamp
システム変数が有効な場合、これはTIMESTAMP
にも当てはまります (セクション5.1.8「サーバーシステム変数」を参照してください)。 それ以外の場合、テーブルの最初のTIMESTAMP
カラムのデフォルト値は現在の日付と時間になります。 セクション11.2「日時データ型」を参照してください。ENUM
ではない文字列型のデフォルト値は空の文字列です。ENUM
のデフォルトは、最初の列挙値です。