Когда обновляется метка времени (автоматически)?


79

Если у меня есть столбец в таблице типа TIMESTAMPи по умолчанию: CURRENT_TIMESTAMP, обновляется ли этот столбец до текущей отметки времени, если я обновляю значение любого другого столбца в той же строке?
Кажется, что это не так, но я не уверен, должно ли это происходить.
Я не могу понять, что это значит ( из документации MySQL ):

Если столбец обновляется автоматически, он автоматически обновляется до текущей отметки времени, когда значение любого другого столбца в строке изменяется с его текущего значения. Столбец остается неизменным, если для всех остальных столбцов установлены их текущие значения. Чтобы столбец не обновлялся при изменении других столбцов, явно установите его текущее значение. Чтобы обновить столбец, даже если другие столбцы не меняются, явно установите для него значение, которое он должен иметь] 2


2
почему вы не попробовали это, создав testтаблицу и обновив образцы данных. Кстати, он не обновляет timestampтипизированный столбец при обновлении. Если это не добавлено в определение столбцаON UPDATE CURRENT_TIMESTAMP
OldGaurd01

Ответы:


138

Дайте команду SHOW CREATE TABLE whatever

Затем посмотрите на определение таблицы .

Вероятно, у него есть такая строка

logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

в этом. DEFAULT CURRENT_TIMESTAMPозначает, что любое значение INSERTбез явной настройки отметки времени использует текущее время. Аналогично, это ON UPDATE CURRENT_TIMESTAMPозначает, что любое обновление без явной метки времени приводит к обновлению до текущего значения метки времени.

Вы можете управлять этим поведением по умолчанию при создании своей таблицы.

Или, если столбец отметки времени изначально был создан неправильно, вы можете изменить его.

ALTER TABLE whatevertable
     CHANGE whatevercolumn 
            whatevercolumn TIMESTAMP NOT NULL
                           DEFAULT CURRENT_TIMESTAMP 
                           ON UPDATE CURRENT_TIMESTAMP;

Это приведет к тому, что операции INSERT и UPDATE в таблице автоматически обновят столбец метки времени. Если вы хотите обновить whatevertableбез изменения метки времени, то есть

Чтобы предотвратить обновление столбца при изменении других столбцов

то вам нужно выпустить такое обновление.

UPDATE whatevertable
   SET something = 'newvalue',
       whatevercolumn = whatevercolumn
 WHERE someindex = 'indexvalue'

Это работает с TIMESTAMPи DATETIMEстолбцов. (До MySQL версии 5.6.5 он работал только с TIMESTAMPs). Когда вы используете TIMESTAMPs, учитываются часовые пояса: на правильно настроенном сервере эти значения всегда хранятся в формате UTC и переводятся в местное время при извлечении.


1
DEFAULT CURRENT_TIMESTAMP means that any INSERT without an explicit time stamp setting results using the current time. В моем случае у меня есть , DEFAULT CURRENT_TIMESTAMP но на UPDATEколонки не обновляется. Так что я не понимаю, что вы имеете в виду в этом предложении
Джим

Смотрите мою правку, где я пытался уточнить. Поведение по умолчанию INSERT и UPDATE контролируется отдельно.
O. Jones

Да, операции INSERT и UPDATE, дающие имя столбца timestamp, переопределят поведение по умолчанию current_timestamp.
O. Jones

1
Спасибо, сэр. Идеальное решение одной из моих проблем
Эдвинфад

phpMyAdmin сообщает об ошибке в SQL-запросе: «У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис рядом с« NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP »в строке 1»
Primož Kralj

14

Я думаю, вам нужно определить столбец временной метки следующим образом

СОЗДАТЬ ТАБЛИЦУ t1 
(
    ts TIMESTAMP ПО УМОЛЧАНИЮ CURRENT_TIMESTAMP ПРИ ОБНОВЛЕНИИ CURRENT_TIMESTAMP
);

Смотрите здесь


1
Шахта толькоDEFAULT CURRENT_TIMESTAMP
Джим

4

Автоматически обновляемый столбец автоматически обновляется до текущей отметки времени, когда значение любого другого столбца в строке изменяется с его текущего значения. Автоматически обновляемый столбец остается неизменным, если для всех остальных столбцов установлены их текущие значения.

Чтобы объяснить это, представьте, что у вас есть только одна строка:

-------------------------------
| price | updated_at          |
-------------------------------
|  2    | 2018-02-26 16:16:17 |
-------------------------------

Теперь, если вы запустите следующий столбец обновления:

 update my_table
 set price = 2

он не изменит значение updated_at, поскольку значение цены фактически не изменилось (было уже 2).

Но если у вас есть другая строка со значением цены, отличным от 2, то значение updated_at этой строки (с ценой <> 3) будет обновлено до CURRENT_TIMESTAMP.


Подтвержденное поведение, как описано в MySQL. Кроме того, он не считается, INSERTесли никакие значения не изменились, поэтому такой вызов PHP $this->pdo->lastInsertId()возвращает 0(без вставки) вместо идентификатора для строки, содержащей данные, которые остались прежними.
OXiGEN

@OXiGEN - UPDATEнет INSERT, поэтому я не ожидал, что оно lastInsertIdбудет содержать значение - независимо от того, изменится ли какой-либо столбец или нет. lastInsertIdкак правило , используется только при новой строки , имеющей идентификатор столбца автоинкрементным (чтобы выяснить , что ID был назначен); не при изменении существующих строк. INSERT
ToolmakerSteve

3

Добавьте триггер в базу данных:

DELIMITER //
CREATE TRIGGER update_user_password 
  BEFORE UPDATE ON users
  FOR EACH ROW
    BEGIN
      IF OLD.password <> NEW.password THEN
        SET NEW.password_changed_on = NOW();
      END IF;
    END //
DELIMITER ;

Время смены пароля обновится только при изменении столбца пароля.


2

Добавляем, где найти UPDATE CURRENT_TIMESTAMP потому что для новых людей это беспорядок.

Большинство людей будут использовать phpmyadmin или что-то в этом роде.

Значение по умолчанию вы выбираете CURRENT_TIMESTAMP

Атрибуты (другое раскрывающееся меню) вы выбираете UPDATE CURRENT_TIMESTAMP

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.