デフォルト値
データ型仕様の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 つの例は同様のデフォルトを示していますが、リテラルではなく式を使用しているため、最初の例のみが有効です。