Spec-Zone .ru
спецификации, руководства, описания, API
|
Следующее обсуждение применяется под предположением что explicit_defaults_for_timestamp
системная переменная отключается. Если эта
переменная включается, DEFAULT CURRENT_TIMESTAMP
и ON
UPDATE CURRENT_TIMESTAMP
пункты, которые определяют автоматическую инициализацию и обновление,
доступны, но не присваиваются никому TIMESTAMP
столбец если явно не включено в определение столбца.
TIMESTAMP
и DATETIME
столбцы могут быть автоматически initializated и обновлены к текущей
дате и время (то есть, текущая метка времени).
Для любого TIMESTAMP
или DATETIME
столбец
в таблице, можно присвоить текущую метку времени как значение по умолчанию, значение автоматического обновления,
или обоих:
Автоинициализированный столбец устанавливается в текущую метку времени для вставленных строк, которые не определяют значения для столбца.
Автообновленный столбец автоматически обновляется к текущей метке времени, когда
значение любого другого столбца в строке изменяется от ее текущей стоимости. Автообновленный столбец
остается неизменным, если все другие столбцы устанавливаются в их текущую стоимость. Чтобы
препятствовать автообновленному столбцу, обновить, когда другие столбцы изменяются, явно установите это
в его текущую стоимость. Чтобы обновить автообновленный столбец, даже когда другие столбцы не
изменяются, явно установите это в значение, в которое это должно иметь (например, установить это CURRENT_TIMESTAMP
).
Кроме того, можно инициализировать или обновить любого 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
определения столбца могут определить текущую метку времени и для
значения по умолчанию и для значений автоматического обновления для одного, но не другого, или ни для одного. У
различных столбцов могут быть различные комбинации автоматических свойств. Следующие правила описывают
возможности:
С обоими 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);
С a 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
у столбцов нет никаких автоматических свойств, если они не определяются
явно с этим исключением: По умолчанию, первое TIMESTAMP
у столбца есть оба DEFAULT
CURRENT_TIMESTAMP
и ON UPDATE CURRENT_TIMESTAMP
если ни один не
определяется явно. Подавить автоматические свойства для первого TIMESTAMP
столбец, сделайте любое из следующего:
Определите столбец с помощью a DEFAULT
пункт, который
определяет постоянное значение по умолчанию.
Определите NULL
атрибут. Это также заставляет столбец
разрешать NULL
значения, что означает, что невозможно присвоить текущую
метку времени, устанавливая столбец в NULL
. Присвоение NULL
устанавливает столбец в NULL
.
Рассмотрите эти табличные определения:
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.
Если 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 более ограничивается поддержка автоматической инициализации и обновления:
DEFAULT CURRENT_TIMESTAMP
и ON
UPDATE CURRENT_TIMESTAMP
не может использоваться с DATETIME
столбцы.
DEFAULT CURRENT_TIMESTAMP
и ON
UPDATE CURRENT_TIMESTAMP
может использоваться с самое большее один TIMESTAMP
столбец на таблицу. Не возможно иметь текущую метку времени
быть значением по умолчанию для одного столбца и значением автоматического обновления для другого
столбца.
Можно выбрать, использовать ли эти свойства и который 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
значения
не берут текущую метку времени во время вставки кроме при одном из
следующих условий:
Его значение по умолчанию определяется как CURRENT_TIMESTAMP
и никакое значение не определяется для столбца
CURRENT_TIMESTAMP
или любой из его синонимов такой как NOW()
явно вставляется в столбец
Другими словами, 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);