デフォルト値
データ型仕様のDEFAULT値句は、列のデフォルト値を示します。
すべてのデータ型にデフォルト値を設定できます。通常、デフォルト値は定数でなければならず、関数や式は使用できませんが、いくつか例外があります。
- 時間型の場合、
TIMESTAMPとDATETIME列のデフォルト値としてNOW、CURRENT_TIMESTAMP、LOCALTIME、LOCALTIMESTAMP関数を使用できます。 - 整数型の場合、
NEXT VALUE FOR関数を使用してシーケンスの次の値を列の既定値として設定し、RAND()関数を使用してランダムな浮動小数点値を列の既定値として生成できます。 - 文字列型の場合、
UUID()関数を使用して、列のデフォルト値としてユニバーサルユニーク識別子 (UUID)生成できます。 - バイナリ型の場合、
UUID_TO_BIN()関数を使用して UUID をバイナリ形式に変換し、変換された値を列のデフォルト値として設定できます。 - v8.0.0 以降、TiDB は
BLOB、TEXT、JSONデータ型に対してデフォルト値を指定する追加でサポートしますが、それらに対してデフォルト値設定するには式のみを使用できます。
列定義に明示的なDEFAULT値が含まれていない場合、TiDB は次のようにデフォルト値を決定します。
- 列が値として
NULL取ることができる場合、列は明示的なDEFAULT NULL句で定義されます。 - 列が値として
NULL取ることができない場合は、TiDB は明示的なDEFAULT句なしで列を定義します。
明示的なDEFAULT節のないNOT NULL列へのデータ入力の場合、 INSERTまたはREPLACEステートメントに列の値が含まれていないと、TiDB はその時点で有効な SQL モードに従って列を処理します。
- 厳密なSQLモードが有効になっている場合、トランザクションテーブルではエラーが発生し、文はロールバックされます。非トランザクションテーブルではエラーが発生します。
- 厳密モードが有効になっていない場合、TiDB は列を列データ型の暗黙的なデフォルト値に設定します。
暗黙のデフォルトは次のように定義されます。
- 数値型の場合、デフォルトは 0 です。1
AUTO_INCREMENTで宣言された場合、デフォルトはシーケンス内の次の値になります。 TIMESTAMP以外の日付と時刻型の場合、デフォルト値はその型に適切な「ゼロ」値です。3TIMESTAMP場合、デフォルト値は現在の日付と時刻です。ENUM以外の文字列型の場合、デフォルト値は空文字列です。3ENUM場合、デフォルト値は最初の列挙値です。
式をデフォルト値として指定する
MySQL 8.0.13以降では、 DEFAULTのデフォルト値として式を指定できるようになりました。詳細については、 MySQL 8.0.13以降の明示的なデフォルト処理参照してください。
TiDB は、 DEFAULT句のデフォルト値として次の式を指定することをサポートしています。
UPPER(SUBSTRING_INDEX(USER(), '@', 1))REPLACE(UPPER(UUID()), '-', '')- 次の形式の
DATE_FORMAT式:DATE_FORMAT(NOW(), '%Y-%m')DATE_FORMAT(NOW(), '%Y-%m-%d')DATE_FORMAT(NOW(), '%Y-%m-%d %H.%i.%s')DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')
STR_TO_DATE('1980-01-01', '%Y-%m-%d')CURRENT_TIMESTAMP():どちらもデフォルトCURRENT_DATE()小数秒精度(fsp)を使用しますJSON_OBJECT()JSON_ARRAY()JSON_QUOTE()NEXTVAL()RAND()UUID()UUID_TO_BIN()VEC_FROM_TEXT()
TiDBは、 BLOB 、 TEXT 、 JSONデータ型にデフォルト値を割り当てることができます。ただし、これらのデータ型のデフォルト値を定義するには、リテラルではなく式のみを使用できます。以下はBLOBの例です。
CREATE TABLE t2 (
b BLOB DEFAULT (RAND())
);
UUID の使用例:
CREATE TABLE t3 (
uuid BINARY(16) DEFAULT (UUID_TO_BIN(UUID())),
name VARCHAR(255)
);
UUID の使用方法の詳細については、 UUIDを主キーとして使用するベストプラクティス参照してください。
JSON使用例:
CREATE TABLE t4 (
id bigint AUTO_RANDOM PRIMARY KEY,
j json DEFAULT (JSON_OBJECT("a", 1, "b", 2))
);
JSONに許可されないものの例:
CREATE TABLE t5 (
id bigint AUTO_RANDOM PRIMARY KEY,
j json DEFAULT ('{"a": 1, "b": 2}')
);
最後の 2 つの例は同様のデフォルトを示していますが、リテラルではなく式を使用しているため、最初の例のみが有効です。