MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  データ型  /  データ型デフォルト値

11.6 データ型デフォルト値

データ型指定には、明示的または暗黙的なデフォルト値を指定できます。

データ型指定の 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 句の処理の一部の側面は、次に説明するように、バージョンに依存します。

MySQL 8.0.13 での明示的なデフォルト処理

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 の場合、宛先テーブルには元のテーブルの式のデフォルト値が保持されます。

式のデフォルト値が非決定的関数を参照している場合、式を評価するステートメントはステートメントベースレプリケーションでは安全ではありません。 これには、INSERTUPDATE などのステートメントが含まれます。 この場合、バイナリロギングが無効になっていると、ステートメントは通常どおりに実行されます。 バイナリロギングが有効で、binlog_formatSTATEMENT に設定されている場合、ステートメントはログに記録されて実行されますが、レプリケーションスレーブが相違する可能性があるため、警告メッセージがエラーログに書き込まれます。 binlog_formatMIXED または 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「式評価での型変換」を参照してください。

MySQL 8.0.13 より前の明示的なデフォルト処理

例外として、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 のデフォルトは、最初の列挙値です。


関連キーワード:  カラム, DEFAULT, ステートメント, 参照, テーブル, 明示, クラス, TIMESTAMP, TABLE, 処理