Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Введите команду 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 в таблице автоматически обновят столбец timestamp. Если вы хотите обновить whatevertable без изменения метки времени, то есть,

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

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

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

И это работает только с столбцами TIMESTAMP, а не с столбцами DATETIME или DATE. Поскольку столбцы TIMESTAMP s, TIMESTAMP зоны учитываются: на правильно настроенной серверной машине эти значения всегда хранятся в формате UTC и переводятся в локальное время после извлечения.

Ответ 2

Я думаю, вам нужно определить столбец timestamp, подобный этому

CREATE TABLE t1 
(
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

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

Ответ 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 ;

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

Ответ 4

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

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

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

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

Ответ 5

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

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

-------------------------------
| 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.