Если у меня есть столбец в таблице типа TIMESTAMP
и по умолчанию: CURRENT_TIMESTAMP, обновляется ли этот столбец до текущей отметки времени, если я обновляю значение любого другого столбца в той же строке?
Кажется, что это не так, но я не уверен, должно ли это происходить.
Я не могу понять, что это значит ( из документации MySQL ):
Если столбец обновляется автоматически, он автоматически обновляется до текущей отметки времени, когда значение любого другого столбца в строке изменяется с его текущего значения. Столбец остается неизменным, если для всех остальных столбцов установлены их текущие значения. Чтобы столбец не обновлялся при изменении других столбцов, явно установите его текущее значение. Чтобы обновить столбец, даже если другие столбцы не меняются, явно установите для него значение, которое он должен иметь] 2
test
таблицу и обновив образцы данных. Кстати, он не обновляетtimestamp
типизированный столбец при обновлении. Если это не добавлено в определение столбцаON UPDATE CURRENT_TIMESTAMP
Ответы:
Дайте команду
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 он работал только сTIMESTAMP
s). Когда вы используетеTIMESTAMP
s, учитываются часовые пояса: на правильно настроенном сервере эти значения всегда хранятся в формате UTC и переводятся в местное время при извлечении.источник
DEFAULT CURRENT_TIMESTAMP means that any INSERT without an explicit time stamp setting results using the current time
. В моем случае у меня есть ,DEFAULT CURRENT_TIMESTAMP
но наUPDATE
колонки не обновляется. Так что я не понимаю, что вы имеете в виду в этом предложенииЯ думаю, вам нужно определить столбец временной метки следующим образом
Смотрите здесь
источник
DEFAULT CURRENT_TIMESTAMP
Автоматически обновляемый столбец автоматически обновляется до текущей отметки времени, когда значение любого другого столбца в строке изменяется с его текущего значения. Автоматически обновляемый столбец остается неизменным, если для всех остальных столбцов установлены их текущие значения.
Чтобы объяснить это, представьте, что у вас есть только одна строка:
------------------------------- | 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.
источник
INSERT
если никакие значения не изменились, поэтому такой вызов PHP$this->pdo->lastInsertId()
возвращает0
(без вставки) вместо идентификатора для строки, содержащей данные, которые остались прежними.UPDATE
нетINSERT
, поэтому я не ожидал, что оноlastInsertId
будет содержать значение - независимо от того, изменится ли какой-либо столбец или нет.lastInsertId
как правило , используется только при новой строки , имеющей идентификатор столбца автоинкрементным (чтобы выяснить , что ID был назначен); не при изменении существующих строк.INSERT
Добавьте триггер в базу данных:
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 ;
Время смены пароля обновится только при изменении столбца пароля.
источник
Добавляем, где найти
UPDATE CURRENT_TIMESTAMP
потому что для новых людей это беспорядок.Большинство людей будут использовать phpmyadmin или что-то в этом роде.
Значение по умолчанию вы выбираете CURRENT_TIMESTAMP
Атрибуты (другое раскрывающееся меню) вы выбираете UPDATE CURRENT_TIMESTAMP
источник