[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сравнить все новые и старые значения
VeRTak
Всем привет!

Сделал триггер на update, но дело в том что мне надо сравнивать значение в колонках новое и старое если оно изменилась делать update в другой таблице, но сравнивать надо не все колонки, только некоторые можно конечно перечислить все столбцы в таблице через if и все будет работать, но в таблицу могут попадать новые колонки и просто про триггер могут забыть что бы в него дописать.


BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE a CHAR(55);
DECLARE b CHAR(55);
DECLARE с CHAR(55);
DECLARE cur CURSOR FOR
SELECT
`COLUMN_NAME`
FROM information_schema.COLUMNS
WHERE
`TABLE_NAME`='stories';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
Open cur;
WHILE not done DO
FETCH cur INTO a;
SET b = CONCAT('NEW.', a);
SET с = CONCAT('OLD.', a);
IF (b <> с) THEN
Тут Update
END IF;
END WHILE;
Close cur;
END


И проблема в том что после CONCAT это уже становится просто строкой, и сравнивать одно и тоже по кругу бессмысленно, динамикой в триггерах пользоваться нельзя, думал передавать строку в процедуру, но процедура тогда не в курсе про NEW и OLD. Кто что может подсказать по этому поводу?
Игорь_Vasinsky
мой юный друг.

если если строка не нуждается в обновлении и ты попытаешься сделать обновление - бд его не сделает, т.к. обновление не требуется. это все на уровне бд.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
VeRTak
Игорь_Vasinsky

Не совсем понял суть написаного. Я же говорю задачу можно данную решить если все колонки перечислить через IF, но не совсем удобно, хотелось бы прогнать через цикл, а в переменную положить колонки которые нужно исключить, я думаю что это вполне нормально, но похоже не для mysql
VeRTak
Что у нас так мало специалистом по mysql? Никто ничего подсказать не может?
Valick
VeRTak, специалистов хватает, не хватает нормальных вопросов.


_____________
Стимулятор ~yoomoney - 41001303250491
VeRTak
Valick Дэк вроде все доступно объяснил, подскажи что не понятно, постараюсь переформулировать вопрос
Valick
VeRTak, ты про главное не рассказал. Какие такие жизненные обстоятельства заставили тебя выдумывать эту чепургу? У тебя есть хоть одна бумажная книга на рабочем столе по MySQL?
Есть мнение, что проблему которую ты стараешься преодолеть, ты создал себе сам.

_____________
Стимулятор ~yoomoney - 41001303250491
Kusss
Valick
Не всегда это так.
Вот бывает что один "продукт" использует что-то от другого, вот и приходится заниматься чем-то подобным.
sergeiss
В Постгре это легко делается... wink.gif Но, правда, ТС говорит, что менеджмент не горит желанием отказываться от Мускуля.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
VeRTak
Цитата (Valick @ 2.10.2018 - 11:07)
Какие такие жизненные обстоятельства заставили тебя выдумывать эту чепургу?


Проект которому 12 лет.

Цитата (Valick @ 2.10.2018 - 11:07)
Есть мнение, что проблему которую ты стараешься преодолеть, ты создал себе сам.


Это вряд ли. Возможно есть другое решение, но я его не нашел
bestxp
ну тогда думаю стоит обратиться к результатам запроса https://dev.mysql.com/doc/refman/8.0/en/show-tables.html
walerus
VeRTak
Цитата
но сравнивать надо не все колонки, только некоторые
В любом случае нужно как то об этом знать, какие именно колонки нужно обновить.

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

Цитата
Игорь_Vasinsky
Цитата
мой юный друг.

если если строка не нуждается в обновлении и ты попытаешься сделать обновление - бд его не сделает, т.к. обновление не требуется. это все на уровне бд.

Имел ввиду, что "строки" сравнивать НЕ нужно, если строка NEW будет идентична строке "OLD", то мускуль сам поймет, что обновлять ее не нужно, т.е. IF -> THEN, как таковой не нужно делать... UPDATE он ей не сделает, просто пропустит.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.