Spec-Zone.ru › MySQL 9.2

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-9.2-en/data-type-defaults.html

Spec-Zone.ru

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