2015-12-29 2 views
3

База данных MySQL будет изменяться с использованием системы PHP Crud, и мне нужно отслеживать, когда каждая запись была изменена.Возможно ли установить несколько автоматических столбцов TIMESTAMP в MySQL для отслеживания изменений, сделанных в каждом столбце?

Например, если моя таблица имеет 30 строк и 30 столбцов, и я хочу поставить «Последнее изменение» рядом с каждой отдельной записью, могу ли я как-то настроить 30 столбцов TIMESTAMP, связанных с каждым существующим столбцом, чтобы достичь этого?

Или есть лучший способ?

Вот что я в принципе хочу:

Column 1 C1s TIMESTAMP Column 2 C2s TIMESTAMP Column 3 C3s TIMESTAMP... 
Red  (lastModified) Green  (lastModified) Blue  (lastModified) 
Orange  (lastModified) Purple  (lastModified) Pink  (lastModified) 
Yellow  (lastModified) Black  (lastModified) Brown  (lastModified) 
... etc 
+0

Я думаю, что вы можете установить это время обновления из запроса на вставку/обновление или с помощью триггера. – genespos

ответ

0

Не с родной MySQL автоматической инициализации функции TIMESTAMP/DATETIME в одиночку.

По Mysql 5.6.5 вы можете иметь много авто intitializing TIMESTAMP (или DATETIME) столбцов, как вы хотите, однако эти работы на уровне записи, а не колонки.

Что я имею в виду, что вы можете автообозначить любой TIMESTAMP при создании на CURRENT_TIMESTAMP. Вы также можете установить столбец TIMESTAMP для обновления при изменении ЗАПИСЬ. Однако всех колонок установить, чтобы обновить временные метки modifcation будет обновляться, когда любой столбец обновляется (http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html)

Учитывая это, имеет смысл только иметь максимум 2 авто TIMESTAMP колонки: одна для записи даты создания, другой для даты изменения.

Вот как вы создаете авто увеличивающихся timestamp столбцов:

ALTER TABLE sometable 
    ADD COLUMN created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    ADD COLUMN modified_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
            ON UPDATE CURRENT_TIMESTAMP; 

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

Вам понадобится реализовать триггер с пользовательской процедурой, чтобы выполнить ваши потребности.

+0

@GraemeFindlay см. Мой отредактированный ответ. Я добавил инструкцию alter table – Ray

+0

. Спасибо @Ray, я полностью понимаю, что встроенный TIMESTAMP функциональность не даст мне то, что мне нужно. Можете ли вы рассказать о том, как я могу «вызвать пользовательскую процедуру» при внесении изменений? – Graeme

+0

bdifferent уже показал вам, что –

0

Должно быть возможно определить, какой столбец был изменен. Поскольку у вас есть доступ к значениям OLD и NEW, вы можете проверить каждое поле, если оно изменилось, и если оно изменилось, введите новую метку времени в соответствующее поле. Что-то вроде:

CREATE TRIGGER updateTable 
BEFORE UPDATE ON tableA 
FOR EACH ROW 
BEGIN 
    IF OLD.field1 != NEW.field1 THEN 
     SET NEW.timestamp1 = now() 
    END IF; 
    IF OLD.field2 != NEW.field2 THEN 
     SET NEW.timestamp2 = now() 
    END IF; 
END 

Я думаю, что это может сработать, но я его не тестировал.

+0

Это способ сделать это. Попутно - я работал над системами, которые хранят всю запись (в отдельной таблице) плюс временную метку, чтобы можно было выполнить «повтор». –

+0

А, я думаю, я понимаю, как работает Trigger. Когда база данных обнаруживает, что происходит ОБНОВЛЕНИЕ, она хранит текущие данные, делает обновление и затем сравнивает его с недавно измененными данными. Это верно? Где хранится этот код триггера? Могу ли я просто ввести его в SQL Query через phpMyAdmin? – Graeme

+0

Да, создание триггера - это просто запрос sql, который вы можете запустить в phpMyAdmin. Для описания синтаксиса вы можете найти здесь примеры. https://dev.mysql.com/doc/refman/5.5/ru/trigger-syntax.html – bdifferent

0

Другой способ сделать то, что вы хотите как подмножество большего средства, - это реализовать журнал изменений. Поместите триггер на каждый стол. В каждом триггере записывайте запись «запись аудита» в таблицу, которая имеет детали, определенные логикой триггера: какое поле изменилось, старое значение, новое значение и временная метка, когда это произошло.

Элемент аудита может иметь автоматическую метку времени, а не явно управлять ею. С небольшим количеством умений триггеры могут подавать общую хранимую процедуру, которая принимает параметр tablename, а также другую информацию.

Это предоставит полную историю все изменения, а не только последние.

Смежные вопросы