Когда обновляется метка времени (auto)?
Если у меня есть столбец в таблице типа TIMESTAMP
и имеет значение по умолчанию: CURRENT_TIMESTAMP делает этот столбец обновленным до текущей метки времени, если я обновляю значение
любого другого столбца в той же строке?
Кажется, что это не так, но я не уверен, что это должно произойти.
Я не понимаю, что это означает (из документации MySQL):
Если столбец автоматически обновляется, он автоматически обновляется до текущая временная метка, когда значение любого другого столбца в строке равно изменено с текущего значения. Столбец остается неизменным, если все другие столбцы установлены на их текущие значения. Чтобы предотвратить столбец начиная с обновления при изменении других столбцов, явным образом текущая стоимость. Чтобы обновить столбец, даже если другие столбцы не измените, явно установите его значение, которое оно должно иметь] 2
Ответы
Ответ 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.