Коли оновлюється позначка часу (авто)?


79

Якщо у мене є стовпець у таблиці типу TIMESTAMPі за замовчуванням використовується: CURRENT_TIMESTAMP, чи оновлюється цей стовпець до поточної позначки часу, якщо я оновлюю значення будь-якого іншого стовпця в тому ж рядку?
Здається, що ні, але я не впевнений, чи так має статися.
Я не можу зрозуміти, що це означає ( з документації MySQL ):

Якщо стовпець автоматично оновлюється, він автоматично оновлюється до поточної позначки часу, коли значення будь-якого іншого стовпця в рядку змінюється від поточного значення. Стовпець залишається незмінним, якщо для всіх інших стовпців встановлені поточні значення. Щоб стовпець не оновлювався при зміні інших стовпців, явно встановіть для нього поточне значення. Щоб оновити стовпець, навіть коли інші стовпці не змінюються, явно встановіть для нього значення, яке воно повинно мати] 2


2
чому ви не спробували це, створивши testтаблицю та оновивши зразкові дані. До речі, він не оновлює timestampнабраний стовпець в update. Якщо це не додано до визначення стовпця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стовпцями. (До версії 5.6.5 MySQL він працював лише з 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 поведінка за замовчуванням контролюється окремо.
О. Джонс,

Так, як операції INSERT, так і UPDATE, які дають ім'я стовпця позначки часу, замінять поведінку current_timestamp за замовчуванням.
О. Джонс,

1
Дякую вам сер. Ідеальне рішення однієї з моїх проблем
Edwinfad

phpMyAdmin каже, що в запиті SQL є помилка "У вас є помилка у вашому синтаксисі SQL; перевірте інструкцію, яка відповідає версії вашого сервера MySQL, щоб знайти правильний синтаксис біля" NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP "у рядку 1"
Primož Kralj

14

Думаю, вам потрібно визначити стовпець часової позначки таким чином

СТВОРИТИ ТАБЛИЦЮ t1 
(
    ts TIMESTAMP ЗАВДАННЯ CURRENT_TIMESTAMP ON UPDATE 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.