Spec-Zone.ru › MySQL 9.2

13.2.5 Автоматическая инициализация и обновление для типов TIMESTAMP и DATETIME

TIMESTAMP и DATETIME столбцы могут быть автоматически инициализированы и обновлены до текущей даты и времени (то есть текущей метки времени).

Для любого столбца типа TIMESTAMP или DATETIME в таблице можно задать текущую метку времени в качестве значения по умолчанию, значения для автоматического обновления или и того, и другого:

  • Столбец с автоматической инициализацией устанавливается в текущую метку времени для вставляемых строк, которые не указывают значения для столбца.

  • Столбец с автоматическим обновлением автоматически обновляется до текущей метки времени, когда значение любого другого столбца в строке изменяется с текущего значения. Столбец с автоматическим обновлением остается неизменным, если все остальные столбцы установлены на свои текущие значения. Чтобы предотвратить обновление столбца с автоматическим обновлением при изменении других столбцов, явно установите его в текущее значение. Чтобы обновить столбец с автоматическим обновлением даже когда другие столбцы не меняются, явно установите его в нужное значение (например, установите его в CURRENT_TIMESTAMP).

Кроме того, если переменная сервера explicit_defaults_for_timestamp отключена, можно инициализировать или обновить любой столбец типа TIMESTAMP (но не DATETIME) до текущей даты и времени, присвоив ему значение NULL, если он не был определён с атрибутом NULL, разрешающим значения NULL.

Для указания автоматических свойств используйте клаузы DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP в определениях столбцов. Порядок клаузов не имеет значения. Если обе клаузы присутствуют в определении столбца, любая из них может стоять первой. Любой из синонимов функции CURRENT_TIMESTAMP имеет то же значение, что и CURRENT_TIMESTAMP. К ним относятся CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP и LOCALTIMESTAMP().

Использование DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP специфично для TIMESTAMP и DATETIME. Клауза DEFAULT также может быть использована для задания постоянного (неавтоматического) значения по умолчанию (например, DEFAULT 0 или DEFAULT '2000-01-01 00:00:00').

Примечание

В следующих примерах используется DEFAULT 0, значение по умолчанию, которое может вызывать предупреждения или ошибки в зависимости от того, включен ли строгий режим SQL или режим SQL NO_ZERO_DATE. Имейте в виду, что режим SQL TRADITIONAL включает строгий режим и NO_ZERO_DATE. См. Раздел 7.1.11, «Режимы SQL сервера».

Определения столбцов типа TIMESTAMP или DATETIME могут указывать текущую метку времени как для значения по умолчанию, так и для значения автоматического обновления, для одного из них, но не для другого, или ни для одного из них. Разные столбцы могут иметь разные комбинации автоматических свойств. Следующие правила описывают возможные варианты:

  • При использовании DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP столбец имеет текущую метку времени в качестве значения по умолчанию и автоматически обновляется до текущей метки времени.

    CREATE TABLE t1 (
      ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    );
    
  • При использовании клаузы DEFAULT, но без клаузы ON UPDATE CURRENT_TIMESTAMP, столбец имеет заданное значение по умолчанию и не обновляется автоматически до текущей метки времени.

    Значение по умолчанию зависит от того, задаёт ли клауза DEFAULT текущую метку времени или постоянное значение. С CURRENT_TIMESTAMP значением по умолчанию является текущая метка времени.

    CREATE TABLE t1 (
      ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      dt DATETIME DEFAULT CURRENT_TIMESTAMP
    );
    

    При использовании постоянного значения значение по умолчанию — это заданное значение. В этом случае столбец не имеет автоматических свойств.

    CREATE TABLE t1 (
      ts TIMESTAMP DEFAULT 0,
      dt DATETIME DEFAULT 0
    );
    
  • При использовании клаузы ON UPDATE CURRENT_TIMESTAMP и клаузы с постоянным значением DEFAULT столбец автоматически обновляется до текущей метки времени и имеет заданное постоянное значение по умолчанию.

    CREATE TABLE t1 (
      ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,
      dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
    );
    
  • При использовании клаузы ON UPDATE CURRENT_TIMESTAMP, но без клаузы DEFAULT, столбец автоматически обновляется до текущей метки времени, но не имеет текущей метки времени в качестве значения по умолчанию.

    Значение по умолчанию в этом случае зависит от типа. TIMESTAMP имеет значение по умолчанию 0, если не определен атрибут NULL, в этом случае значение по умолчанию — NULL.

    CREATE TABLE t1 (
      ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,     -- default 0
      ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL
    );
    

    DATETIME имеет значение по умолчанию NULL, если не определен атрибут NOT NULL, в этом случае значение по умолчанию — 0.

    CREATE TABLE t1 (
      dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP,         -- default NULL
      dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0
    );
    

Столбцы типа TIMESTAMP и DATETIME не имеют автоматических свойств, если они не указаны явно, за исключением этого случая: если переменная сервера explicit_defaults_for_timestamp отключена, первый столбец типа TIMESTAMP имеет и DEFAULT CURRENT_TIMESTAMP, и ON UPDATE CURRENT_TIMESTAMP, если ни то, ни другое не указано явно. Чтобы подавить автоматические свойства для первого столбца типа TIMESTAMP, используйте одну из этих стратегий:

  • Включите переменную сервера explicit_defaults_for_timestamp. В этом случае клаузы DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP, определяющие автоматическую инициализацию и обновление, доступны, но не применяются ни к одному столбцу типа TIMESTAMP, если они не включены явно в определение столбца.

  • В противном случае, если explicit_defaults_for_timestamp отключен, выполните одно из следующих действий:

    • Определите столбец с клаузой DEFAULT, которая задает постоянное значение по умолчанию.

    • Укажите атрибут NULL. Это также приводит к тому, что столбец допускает значения NULL, что означает, что вы не можете присвоить текущую метку времени, установив столбец в NULL. Присвоение значения NULL устанавливает столбец в NULL, а не в текущую метку времени. Чтобы присвоить текущую метку времени, установите столбец в CURRENT_TIMESTAMP или синоним, такой как NOW().

Рассмотрим эти определения таблиц:

CREATE TABLE t1 (
  ts1 TIMESTAMP DEFAULT 0,
  ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t2 (
  ts1 TIMESTAMP NULL,
  ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t3 (
  ts1 TIMESTAMP NULL DEFAULT 0,
  ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                ON UPDATE CURRENT_TIMESTAMP);

Таблицы имеют следующие свойства:

  • В каждом определении таблицы первый столбец типа TIMESTAMP не имеет автоматической инициализации или обновления.

  • Таблицы различаются по тому, как столбец ts1 обрабатывает значения NULL. Для t1, ts1 является NOT NULL, и присвоение ему значения NULL устанавливает его в текущую метку времени. Для t2 и t3, ts1 допускает значения NULL, и присвоение ему значения NULL устанавливает его в NULL.

  • t2 и t3 различаются по значению по умолчанию для столбца ts1. Для t2, ts1 определено так, что допускает NULL, поэтому значение по умолчанию также является NULL в отсутствие явной клаузы DEFAULT. Для t3, ts1 допускает NULL, но имеет явное значение по умолчанию 0.

Если определение столбца типа TIMESTAMP или DATETIME включает явное значение точности дробных секунд в любом месте, то это же значение должно использоваться во всём определении столбца. Это разрешено:

CREATE TABLE t1 (
  ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)
);

Это запрещено:

CREATE TABLE t1 (
  ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3)
);

Инициализация TIMESTAMP и атрибут NULL

Если системная переменная explicit_defaults_for_timestamp отключена, столбцы типа TIMESTAMP по умолчанию содержат NOT NULL, не могут содержать NULL значения, а присваивание NULL устанавливает текущую метку времени. Чтобы разрешить столбцу TIMESTAMP содержать NULL, явно укажите его с атрибутом NULL. В этом случае значение по умолчанию также становится NULL, если не переопределено с помощью клаузы DEFAULT, которая задает другое значение по умолчанию. DEFAULT NULL можно использовать для явного задания NULL в качестве значения по умолчанию. (Для столбца TIMESTAMP, не объявленного с атрибутом NULL, DEFAULT NULL недействительно.) Если столбец TIMESTAMP допускает значения NULL, присваивание NULL устанавливает его в NULL, а не в текущую метку времени.

В следующей таблице содержатся несколько столбцов TIMESTAMP, которые допускают значения NULL:

CREATE TABLE t
(
  ts1 TIMESTAMP NULL DEFAULT NULL,
  ts2 TIMESTAMP NULL DEFAULT 0,
  ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
);

Столбец TIMESTAMP, который допускает значения NULL, не принимает текущую метку времени во время вставки, за исключением следующих условий:

  • Его значение по умолчанию определено как CURRENT_TIMESTAMP, и для столбца не указано значение

  • CURRENT_TIMESTAMP или любой его синоним, например NOW(), явно вставлен в столбец

Другими словами, столбец TIMESTAMP, определенный для допуска значений NULL, автоматически инициализируется только в том случае, если его определение включает DEFAULT CURRENT_TIMESTAMP:

CREATE TABLE t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);

Если столбец TIMESTAMP допускает значения NULL, но его определение не включает DEFAULT CURRENT_TIMESTAMP, вы должны явно вставить значение, соответствующее текущей дате и времени. Предположим, что таблицы t1 и t2 имеют следующие определения:

CREATE TABLE t1 (ts TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00');
CREATE TABLE t2 (ts TIMESTAMP NULL DEFAULT NULL);

Чтобы установить столбец TIMESTAMP в любой таблице на текущую метку времени при вставке, явно присвойте ему это значение. Например:

INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);
INSERT INTO t1 VALUES (NOW());

Если системная переменная explicit_defaults_for_timestamp включена, столбцы TIMESTAMP допускают значения NULL только если объявлены с атрибутом NULL. Кроме того, столбцы TIMESTAMP не допускают присваивание NULL для присваивания текущей метки времени, независимо от того, объявлены они с атрибутом NULL или NOT NULL. Чтобы присвоить текущую метку времени, установите столбец в CURRENT_TIMESTAMP или синоним, такой как NOW().

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/timestamp-initialization.html

Spec-Zone.ru

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