Spec-Zone .ru
спецификации, руководства, описания, API

11.3.5. Автоматическая Инициализация и Обновляющий для TIMESTAMP иDATETIME

Отметить

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

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

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

Кроме того, можно инициализировать или обновить любого TIMESTAMP столбец к текущей дате и время, присваивая это a 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 не работайте если NO_ZERO_DATE Режим SQL включается, потому что тот режим вызывает "нулевые" значения даты (определенный, например, как 0 '0000-00-00 00:00:00') быть отклоненным. Знайте что TRADITIONAL Режим SQL включает NO_ZERO_DATE.

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

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

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

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);

У таблиц есть эти свойства:

Если a 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));

Автоматические Свойства Метки времени Перед MySQL 5.6.5

Перед MySQL 5.6.5 более ограничивается поддержка автоматической инициализации и обновления:

Можно выбрать, использовать ли эти свойства и который TIMESTAMP у столбца должны быть они. Это не должен быть первый в таблице, которая автоматически инициализируется или обновляется к текущей метке времени. Определить автоматическую инициализацию или обновляющий для различного TIMESTAMP столбец, следует подавить автоматические свойства для первого, как ранее описано. Затем, для другого TIMESTAMP столбец, правила для DEFAULT и ON UPDATE пункты являются тем же самым что касается первого TIMESTAMP столбец, за исключением того, что, если Вы опускаете оба пункта, никакую автоматическую инициализацию или обновление, происходит.

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

По умолчанию, TIMESTAMP столбцы NOT NULL, не может содержать NULL значения, и присвоение NULL присваивает текущую метку времени. Разрешать a TIMESTAMP столбец, чтобы содержать NULL, явно объявите это с NULL атрибут. В этом случае значение по умолчанию также становится NULL если не переопределено с a DEFAULT пункт, который определяет различное значение по умолчанию. DEFAULT NULL может использоваться, чтобы явно определить NULL как значение по умолчанию. (Для a TIMESTAMP столбец, не объявленный с NULL атрибут, DEFAULT NULL недопустимо.), Если a 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);

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

Другими словами, a 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 t1 VALUES (NOW());INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);