2014-03-24 6 views
0

Мне интересно, можно ли отобразить имя столбца последнего обновленного столбца в таблице.Отобразить имя столбца последнего обновленного столбца

Пример:

**Original Record created on 03/20/14:** 
Name: John 
Height 
Weight 
Age 
Update_date: 03/20/14 
Update_Column: Name 

Тогда кто-то приходит и обновляет высоту на 03/22/14:

Name: John 
Height: 5'9 
Weight 
Age 
Update_date: 03/22/14 
Update_Column: Height 

а также UPDATE_DATE и Update_column изменится снова, если кто-то пришел и поставить значение для возраста. И так далее.

Возможно ли это?

Кроме того, если это возможно, можно ли отобразить имя столбца наиболее правым, если пользователь обновил более одного столбца одновременно?

Пример:

User updates the below record: 
Name: John 
Height: 5'9 
Weight 
Age 
Update_date: 03/22/14 
Update_Column: Height 

И добавляет в весе и возрасте, в то же время на 03/24/14:

Name: John 
Height: 5'9 
Weight: 150 
Age: 31 
Update_date: 03/22/14 
Update_Column: Height 

Update_Column будет отображать Возраст, потому что это самый дальний к правильно. (Думая об этом, когда вы читаете слева направо, так что последний обновленный столбец был бы одним из самых дальних прав)

Итак, чтобы подвести итог, мне нужно показать Update_date (который будет текущим дата последнего обновления записи) и Update_Col (который является именем столбца последнего обновленного столбца и обновляется несколько столбцов, а затем отображает тот, который был обновлен последним)

Надеемся, что примеры помогут чтобы прояснить ситуацию.

Спасибо, Стивен

+0

Вы помечено это как для Oracle и MySQL. Какую базу данных вы используете? –

ответ

0

Вы должны хранить эти мета-данные для каждой строки. Таким образом, вам понадобятся два новых столбца: update_date и update_column. Затем вы можете добавить триггер before update, чтобы проверить, какие столбцы собираются изменить, и установить дату обновления.

обновление Вот пример:

delimiter // 
create table a (
    id int (10) unsigned auto_increment, 
    a int(10), 
    b int(10), 
    update_date datetime NULL, 
    update_column varchar(16) NULL, 
    primary key (id) 
)// 

create trigger bu_a before update on a for each row begin 
    set NEW.update_date = NOW(); 
    set NEW.update_column = NULL; 
    -- you need to start with the rightmost column if you want 
    -- that matched with the highest priority 
    if OLD.b != NEW.b then 
    set NEW.update_column = "b"; 
    elseif OLD.a != NEW.a then 
    set NEW.update_column = "a"; 
    end if; 
end // 

Тест:

insert into a (id,a,b) values (1,1,1), (2,1,1), (3,1,1), (4,1,1)[ 
update a set b = 2 where id = 2; 
update a set a = 2 where id = 3; 
update a set a = 2 where id = 4; 
update a set b = 2 where id = 4; 
select * from a; 

Выход:

ID A B UPDATE_DATE     UPDATE_COLUMN 
1 1 1 (null)      (null) 
2 1 2 March, 24 2014 23:22:33+0000 b 
3 2 1 March, 24 2014 23:22:33+0000 a 
4 2 2 March, 24 2014 23:22:33+0000 b 
+0

спасибо за быстрый ответ. Поэтому, если я правильно понимаю, триггер «до обновления» будет в основном смотреть на то, какие столбцы обновляются, а затем иметь возможность хранить имя столбца в поле Update_column. Я пытаюсь получить лучшее понимание, прежде чем перейти к моему администратору базы данных с вопросом. Он знает ситуацию, но, возможно, это предложение поможет ему написать код. – Doolius

+0

Ну, администраторы баз данных, как правило, не любят триггеры, потому что это добавляет больше нагрузки на db для облегчения работы разработчика.Это зависит от приложения и использования, если лучше создать триггер, который помогает легко сохранить консистенцию или реализовать эту функциональность в логике приложения. В любом случае решение выше делает трюк, если вы пришли к соглашению с DBA :) – fejese

+0

спасибо за пример! Это помогает прояснить ситуацию немного больше. Я буду говорить с DBA завтра так надеюсь, что поможет нам найти решение. – Doolius

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