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.