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.