Spec-Zone.ru › MySQL 8.4

13.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 зависят от версии, как описано ниже.

  • Обработка явных значений по умолчанию

  • Обработка неявных значений по умолчанию

Обработка явных значений по умолчанию

Значение по умолчанию, указанное в операторе 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 в качестве значения по умолчанию без использования скобок. См. Раздел 13.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 (точно так же, как для столбцов с литеральными значениями по умолчанию):

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) для указания значения по умолчанию для именованного столбца разрешено только для столбцов с литеральным значением по умолчанию, а не для столбцов со значением по умолчанию, заданным выражением.

Не все движки хранения позволяют использовать значения по умолчанию, заданные выражениями. Для тех, которые не позволяют, возникает ошибка.

Если значение по умолчанию вычисляется в тип данных, отличный от объявленного типа столбца, происходит неявное преобразование к объявленному типу в соответствии с обычными правилами преобразования типов MySQL. См. Раздел 14.3, «Преобразование типов в вычислении выражений».

Обработка неявных значений по умолчанию

Если спецификация типа данных не включает явное значение DEFAULT, MySQL определяет значение по умолчанию следующим образом:

Если столбец может принимать NULL в качестве значения, столбец определяется с явным оператором DEFAULT NULL.

Если столбец не может принимать NULL в качестве значения, MySQL определяет столбец без явного оператора DEFAULT.

Для ввода данных в столбец NOT NULL, у которого нет явного оператора DEFAULT, если оператор INSERT или REPLACE не включает значение для столбца или оператор UPDATE устанавливает столбец в NULL, MySQL обрабатывает столбец в соответствии с SQL-режимом, действующим в данный момент:

  • Если включен строгий SQL-режим, возникает ошибка для транзакционных таблиц, и оператор откатывается. Для не транзакционных таблиц возникает ошибка, но если это происходит для второй или последующей строки оператора с несколькими строками, предыдущие строки вставляются.

  • Если строгий режим не включен, MySQL устанавливает столбец в неявное значение по умолчанию для типа данных столбца.

Предположим, что таблица t определена следующим образом:

CREATE TABLE t (i INT NOT NULL);

В этом случае i не имеет явного значения по умолчанию, поэтому в строгом режиме каждый из следующих операторов приводит к ошибке и ни одна строка не вставляется. При отсутствии строгого режима только третий оператор приводит к ошибке; неявное значение по умолчанию вставляется для первых двух операторов, но третий оператор терпит неудачу, потому что DEFAULT(i) не может сгенерировать значение:

INSERT INTO t VALUES();
INSERT INTO t VALUES(DEFAULT);
INSERT INTO t VALUES(DEFAULT(i));

См. Раздел 7.1.11, «SQL-режимы сервера».

Для данной таблицы оператор SHOW CREATE TABLE отображает столбцы, у которых есть явный оператор DEFAULT.

Неявные значения по умолчанию определяются следующим образом:

  • Для числовых типов значением по умолчанию является 0, за исключением случаев, когда для целых или чисел с плавающей точкой, объявленных с атрибутом AUTO_INCREMENT, значением по умолчанию является следующее значение в последовательности.

  • Для типов даты и времени, кроме TIMESTAMP, значением по умолчанию является соответствующее значение “ноль” для типа. Это также справедливо для TIMESTAMP, если переменная системы explicit_defaults_for_timestamp включена (см. Раздел 7.1.8, «Переменные системы сервера»). В противном случае, для первого столбца типа TIMESTAMP в таблице значением по умолчанию является текущая дата и время. См. Раздел 13.2, «Типы данных даты и времени».

  • Для строковых типов, кроме ENUM, значением по умолчанию является пустая строка. Для ENUM значением по умолчанию является первое значение перечисления.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/data-type-defaults.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API