2015-04-15 6 views
0

У меня есть эта таблица с лентой новостей, я хочу добавить временные метки в добавленную дату, и я хочу обновить другой столбец, когда сообщение будет отредактировано. Я бы хотел, чтобы это произошло автоматически в MySql. без использования какого-либо PHP-кода.Как автоматически обновлять метку времени при обновлении таблицы?

CREATE TABLE IF NOT EXISTS news (
     id int(11) NOT NULL AUTO_INCREMENT, 
     data text, 
     date_published timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
     date_edited timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
     PRIMARY KEY (id) 
    ); 

Какова наилучшая практика в таком случае?

+1

http://dev.mysql.com/doc/refman/5.6/en/triggers.html –

+0

Может быть контратип http://stackoverflow.com/questions/2045745/mysql-update- timestamp-column-trigger – NinjaCat

+0

Вы вообще искали SO для аналогичного вопроса? На самом деле есть тонны. – Rahul

ответ

1

Вы можете использовать только DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP функции на один столбец временной метки в таблице.

Используйте следующее определение таблицы, чтобы отключить функции для date_published и использовать их для date_edited:

CREATE TABLE IF NOT EXISTS news (
    id INT(11) NOT NULL AUTO_INCREMENT, 
    data TEXT, 
    date_published TIMESTAMP NOT NULL DEFAULT 0, 
    date_edited TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (id) 
); 

При вставке новой строки, передайте значение NULL для date_published автоматически назначать текущую временную метку в этом столбце ,

MySQL Docs на Automatic Initialization and Updating for TIMESTAMP:

Это не обязательно должен быть первый столбец TIMESTAMP в таблице, автоматически инициализируется или обновлен до текущего времени. Однако, чтобы указать автоматическую инициализацию или обновление для столбца TIMESTAMP для , вы должны отключить автоматические свойства для первого. Затем для другого столбца TIMESTAMP правила для предложения DEFAULT и ON UPDATE те же, что и для первого столбца TIMESTAMP , за исключением того, что если вы опускаете оба предложения, автоматическая инициализация или обновление не происходит.

Для подавления автоматических свойств первого столбца TIMESTAMP, сделать либо из следующих действий:

  • Определить столбец с пунктом DEFAULT, который определяет постоянное значение по умолчанию.
  • Укажите атрибут NULL. Это также приводит к тому, что столбец допускает значения NULL, что означает, что вы не можете назначить текущую временную метку, установив столбец в NULL. Назначение NULL устанавливает столбец в NULL.
3

Рассмотрите возможность использования триггеров. Из MySQL docs:

Триггер представляет собой именованный объект базы данных, который связан с таблицей, и активируется, когда происходит определенное событие для таблицы. Некоторые триггеры используют для выполнения проверок значений, которые нужно вставить в таблицу, или для выполнения вычислений значений, связанных с обновлением.

Пример триггера:

CREATE TRIGGER trigger_example AFTER UPDATE ON news 
FOR EACH ROW UPDATE some_table SET another_column = NEW.data; 
Смежные вопросы