VeRTak
27.09.2018 - 20:07
Всем привет!
Сделал триггер на 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
28.09.2018 - 19:19
мой юный друг.
если если строка не нуждается в обновлении и ты попытаешься сделать обновление - бд его не сделает, т.к. обновление не требуется. это все на уровне бд.
_____________
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
29.09.2018 - 21:14
Игорь_Vasinsky
Не совсем понял суть написаного. Я же говорю задачу можно данную решить если все колонки перечислить через IF, но не совсем удобно, хотелось бы прогнать через цикл, а в переменную положить колонки которые нужно исключить, я думаю что это вполне нормально, но похоже не для mysql
Что у нас так мало специалистом по mysql? Никто ничего подсказать не может?
VeRTak, специалистов хватает, не хватает нормальных вопросов.
_____________
Стимулятор ~yoomoney - 41001303250491
Valick Дэк вроде все доступно объяснил, подскажи что не понятно, постараюсь переформулировать вопрос
VeRTak, ты про главное не рассказал. Какие такие жизненные обстоятельства заставили тебя выдумывать эту чепургу? У тебя есть хоть одна бумажная книга на рабочем столе по MySQL?
Есть мнение, что проблему которую ты стараешься преодолеть, ты создал себе сам.
_____________
Стимулятор ~yoomoney - 41001303250491
Valick
Не всегда это так.
Вот бывает что один "продукт" использует что-то от другого, вот и приходится заниматься чем-то подобным.
sergeiss
4.10.2018 - 22:29
В Постгре это легко делается...

Но, правда, ТС говорит, что менеджмент не горит желанием отказываться от Мускуля.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
Цитата (Valick @ 2.10.2018 - 11:07) |
Какие такие жизненные обстоятельства заставили тебя выдумывать эту чепургу? |
Проект которому 12 лет.
Цитата (Valick @ 2.10.2018 - 11:07) |
Есть мнение, что проблему которую ты стараешься преодолеть, ты создал себе сам. |
Это вряд ли. Возможно есть другое решение, но я его не нашел
walerus
2.11.2018 - 18:48
VeRTak
Цитата |
но сравнивать надо не все колонки, только некоторые |
В любом случае нужно как то об этом знать, какие именно колонки нужно обновить.
Мб создать отдельную таблицу/ячейку/етк, в которой будут храниться имена нужных колонок от туда их и вытаскивать перед обработкой.
Цитата |
Игорь_Vasinsky
Цитата | мой юный друг.
если если строка не нуждается в обновлении и ты попытаешься сделать обновление - бд его не сделает, т.к. обновление не требуется. это все на уровне бд. |
|
Имел ввиду, что "строки" сравнивать НЕ нужно, если строка NEW будет идентична строке "OLD", то мускуль сам поймет, что обновлять ее не нужно, т.е. IF -> THEN, как таковой не нужно делать... UPDATE он ей не сделает, просто пропустит.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.