Spec-Zone.ru › MySQL 5.7

11.2.6 Автоматическое инициализирование и обновление для 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. См. Раздел 5.1.10, «Режимы 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 или постоянное значение. С 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)
);

idm45281958834224 Инициализация 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-5.7-en/timestamp-initialization.html

Spec-Zone.ru

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