Оновлення запису БЕЗ оновлення позначки часу


77

У мене є мітка часу в таблиці mysql з атрибутом "ON UPDATE CURRENT_TIMESTAMP". Чи є спосіб вручну вимкнути оновлення позначки часу з особливої ​​нагоди? (наприклад: оновлення запису для перегляду допису в блозі, але не для повторного датування)

Відповіді:


47

Чи є спосіб вручну вимкнути оновлення позначки часу з особливої ​​нагоди? (наприклад: оновлення запису для перегляду допису в блозі, але не для повторного датування)

Здається, вам потрібно налаштувати обмеження за замовчуванням так, щоб воно заповнювало стовпець лише при вставці:

DEFAULT CURRENT_TIMESTAMP

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


1
Чи можете ви показати оператор SQL для оновлення поля для інших, я це сам зрозумів?
кодер

Що робити, якщо я хочу оновити last_updatedполе (зберегти ON UPDATE CURRENT_TIMESTAMPповедінку) як зазвичай, крім випадків, коли оновлення було зроблено лише в одному конкретному стовпці ? Насправді я моделюю db метаданих, щоб зберегти інформацію певних crons (їх джерело, помилка, last_completion_time ). Отже, я last_updatedполе мушу оновлювати лише тоді, коли cron було фактично змінено (а не коли last_completion_timeполе cron оновлено)
y2k-shubham

144

Ви можете вручну встановити значення стовпця на поточне значення в команді оновлення:

UPDATE table SET x=y, timestampColumn=timestampColumn WHERE a=b;

Якщо ви не встановите значення у запиті, воно буде оновлено до поточної позначки часу відповідно до визначення таблиці.


13
"повільніше" - на скільки? Більше, ніж потрібно OP, щоб видалити магію ON UPDATE, додати NOW()до всіх інших його запитів і протестувати свою програму?
Енді,

Наскільки повільніше залежить від кількості рядків, які ви оновлюєте. Якщо ви працюєте з системними журналами буквально з мільйонами рядків, це не просто повільно - це повільно кожного разу, коли ви запускаєте цей запит. Я не пропоную вилучати DEFAULTзначення; простоON UPDATE
Михайло

2
Дякую, це якраз те, що мені було потрібно. У мене є таблиця "blogposts", і коли я оновлюю кількість переглядів, вона оновлює стовпець "datetime_edited" (на позначці часу оновлення). З кожного іншого випадку мені потрібно оновити поле "datetime_edited" - зміни заголовка чи опису, завантаження нового зображення тощо
fsasvari

2
Я би хотів, щоб я проголосував за це ще не раз! Я навіть не знав, що ви можете посилатися на стовпець у записі в заяві про оновлення! Цілий новий світ!
самсон,

Дякую, це відмінне рішення, саме те, що мені потрібно. Рекомендуйте.
Piotr Stępneewski

24

Щоб зробити автоматичне оновлення таблиці / мітки часу:

ALTER TABLE myTable
CHANGE myTimestampColumn
        myTimestampColumn TIMESTAMP NOT NULL
                       DEFAULT CURRENT_TIMESTAMP 
                       ON UPDATE CURRENT_TIMESTAMP;

Щоб зробити це не автоматичним оновленням:

ALTER TABLE myTable
CHANGE myTimestampColumn
        myTimestampColumn TIMESTAMP NOT NULL
                       DEFAULT CURRENT_TIMESTAMP;

ПРИМІТКА. Частина "default_timestamp" за замовчуванням просто встановлює для неї поточний штамп, оскільки поле не є нульовим. Ви можете видалити як null, так і за замовчуванням, якщо хочете.


9

не використовуйте мітки часу, а відстежуйте час вручну.

якщо ви дійсно хочете оновити запис і не оновлюєте його позначку часу:

UPDATE `table` SET `timestamp` = `timestamp`, `col` = 'new data' …;

14
"не використовувати мітки часу", чому?
Petah

4
Вони можуть представляти лише часи з 1.1.1970 по 31.12.2037; автоматично оновлюється лише перший стовпець часової позначки; при відновленні з резервної копії мітки часу пристосовуються до місцевого часового поясу. І, залежно від вашої програми, ви можете не хотіти, щоб цей стовпець оновлювався під час запуску оператора оновлення sql у вашій спинці (ви хочете, щоб мітка часу оновлювалась лише при використанні вашого інтерфейсу для редагування даних)
knittl

Мітки часу явно призначені для відстеження СУЧАСНИХ разів, тому немає проблем з тим, що він має обмежений діапазон значень. "Тільки перший стовпець" теж не є проблемою, і припускаючи, що ви використовуєте принаймні MySQL 4.1.3, локальний часовий пояс не є проблемою, якщо ви використовували mysqldump для резервного копіювання.
AnrDaemon

1
Додаючи до того, що стверджує @AnrDaemon, я впевнений, що ми отримаємо підтримку для діапазонів дат після 2037 року задовго до того, як ми наблизимось до цієї межі, і перехід історичних даних у новий формат часової позначки повинен бути дуже простим (якщо не автоматичним). Крім того, MySQL підтримує кілька стовпців часових позначок принаймні з часу випуску v5.6.10 на початку 2013 року. І якщо ви не хочете, щоб значення мітки часу оновлювалось при оновленні запису, то не вказуйте ОНОВЛЕННЯ ...
nextgentech

0

Якщо ви все-таки змінили часову шкалу під час оновлення, вам слід взяти до уваги, що якщо значення було оновлено, але не змінено (оновлено значення збереження), воно не оновить параметр "on update Current_timestemp", і в цій ситуації вам слід встановити часовий інтервал вручну

SET LastUpdatedDate=NOW() WHERE

Ідея виникла звідси: торкніться запису MYSQL, щоб оновити поле TIMESTAMP

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.