Задать вопрос
@strelkovandreyvalerievich

Как получить разницу одной и той же таблицы базы данных раз в час?

Добрый день, подскажите пожалуйста.
Имеется база данных MariaDB, в ней есть база в которой есть таблица employees
Эта таблица содержит список всех сотрудников, структура её примерно из 10 полей, но для примера можно взять например только два, это PERSONNEL_NUMBER(табельный номер) и FULL_NAME (полное имя)
Таблица примерно на 15 000 строк, и она используется для синхронизации различных приложений с сотрудниками организации, т.е. приложения из неё берут информации, однако у этой таблицы есть один минус, у неё нет (и его никак не сделать, примем как должное) поле CHANGED_DATE, т.е. дата когда сотрудник был изменен (т.е. когда его любое поле было изменено) и потому, сторонним приложениям приходится пробегаться при синхронизации по всем записям.

Вопрос, как можно сделать так, чтобы кроме этой таблицы, периодически, например раз в час, создавалась такая же, либо может некое views, которое содержало бы в себе точно такую же информацию, только плюс ещё одну колонку CHANGED_DATE, а значение её заполнялось бы исходя из сравнения состояний.
Т.е. как я примерно вижу, есть оригинал таблица и есть её копия clone_employees, далее каждый час каким то способ они сравниваются, и все строки которые не совпадают вставляются в третью таблицу diff_employees, в которой также есть поле CHANGED_DATE куда прописывается текущее время
После чего содержимое оригинальной таблицы копируется в clone_employees (чтобы так сказать запомнить текущее состояние, для следующего сравнения)

Возможно способ очень странный, но увы есть только одна оригинальная таблица с которой можно работать, и в ней изначально не возможно по какой то логике ещё хранить дату последнего изменения
  • Вопрос задан
  • 145 просмотров
Подписаться 2 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
Почему бы не создать поле с датой изменения в этой таблице (разумеется, NULL) и заполнять его значение триггером?

Что-то типа

DELIMITER //
 CREATE TRIGGER bu_employees BEFORE UPDATE ON employees
     FOR EACH ROW
     BEGIN
     SET NEW.CHANGED_DATE = NOW();
     END
     //
Ответ написан
@art_karetnikov
Лучший мой проект: Мобильный банк Сбербанка РФ.
Не надо тебе делать полную копию таблицы. По какой логике нельзя поле добавить - я объясню. Чуваки, которые перед тобой работали, пользовались select * from employees... и вставляли это куда ни попадя. Поэтому сейчас если ты еще одно поле добавишь - упадет все, где есть вставка всех полей.

Так вот, тебе нужна таблица-спутник. Четыре поля. Id этой таблицы, Id_employeer, Change_Date, Change_type.
Далее ловишь изменение или добавление основной таблицы и в таблицу-спутник вставляешь данные, какой работник изменен и что с ним стало в Change_type: Insert, Update, Delete. Можно еще Id того, кто это изменение сделал.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы