Задавайте вопросы, мы ответим
Вы не зашли.
Пишу триггер следующей функциональности: при апдейте данных таблицы X, необходимо инкрементировать значение соответствующей записи в таблице Y.
Заткнулся на том, что мне надо определить, существует ли соответствующая запись таблицы Y, или же её нужно сначала добавить.
Логика вида
Неактивен
Неактивен
О как, большое спасибо
Неактивен
Чё-то не подумал я сразу... А значение поля в переменную всунуть?
Неактивен
Неактивен
Так - нет, взял в скобки - заработало, спасибо
Неактивен
Ну и раз такая пьянка, давайте уже добъём ситуацию, авось пригодится в будущем... Занести значение нескольких полей одной выборки в переменные?
Неактивен
Отредактированно deadka (18.05.2011 13:24:16)
Неактивен
Хм, о такой форме даже и не предполагал Проверять не буду, поверим на слово, спасибо за информацию
Неактивен
Пожалуйста . Просто в запросах такая форма работала, думаю, и в триггере сможет.
Неактивен
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
если такого нет то вставит, иначе обновит
Неактивен
Ну да, можно и так, спасибо
Кто-нибудь может описать плюсы и минусы каждого из подходов? Какой предпочтительнее и почему? Если нет разницы, то наверн лучше использовать меньше кода)))
Неактивен
INSERT ON DUPLICATE KEY UPDATE (если применим) в общем случае лучше, чем
SELECT + INSERT, т.к.
а) он атомарен в смысле доступа к данным (никто не удалит строку между запро-
сами из другого потока)
б) он один раз спускается по индексу до строки, а потом или вставляет новую, или
меняет (против двух раз при независимых запросах)
Неактивен
Спасибо за информацию, учтём.
Неактивен
deadka написал:
SET @X := '', @Y := '';
SELECT `field_X` into @X, `field_Y` into @Y FROM `table_Y` WHERE `field_Y`=NEW.`field_X`;
Не заработал такой вариант:
mysql operand should contain 1 column
А очень было бы неплохо....
Есть еще варианты?
Пробовал:
SET @X, @Y := (SELECT `field_X` into @X, `field_Y` into @Y FROM `table_Y` WHERE `field_Y`=NEW.`field_X`);
SET @X := (SELECT `field_X` into @X, `field_Y` into @Y FROM `table_Y` WHERE `field_Y`=NEW.`field_X`);
SELECT @X := `field_X`, @Y := `field_Y` FROM `table_Y` WHERE `field_Y`=NEW.`field_X`;
А два одинаковых запроса делать для получения двух полей - как-то не по ФенШую
Неактивен
deadka написал:
SET @X := '', @Y := '';
SELECT `field_X` into @X, `field_Y` into @Y FROM `table_Y` WHERE `field_Y`=NEW.`field_X`;
Вот так правильно:
SET @X := '', @Y := '';
SELECT `field_X`, `field_Y` INTO @X, @Y FROM `table_Y` WHERE `field_Y`=NEW.`field_X`;
Неактивен
Понадобилось допилить существующий триггер, решил заодно заюзать конструкцию "INSERT ON DUPLICATE KEY UPDATE" вместо SELECT/INSERT, но оказалось не всё так просто в моём случае))
Дело в том, что у меня в UPDATE фигурируют разные поля в зависимости от значения NEW.`field`. Собственно вопрос, могу ли я в этом UPDATE дописать парочку ифов? В моём случае получается 3 действия:
1. Если NEW.`field` = Х, обновляем значение поля Х.
2. Если NEW.`field` = Y, обновляем значение поля Y.
3. Если NEW.`field` = Z, вобще ничего не обновляем.
Я так понимаю, в данном случае всё же придётся использовать отдельно SELECT/INSERT/UPDATE?
Неактивен
Актуальна ли еще тема? Работа с переменными в триггерах у меня выглядит примерно так:
Неактивен
var1 и @var1 это разные переменные.
Неактивен
vasya написал:
var1 и @var1 это разные переменные.
Нда... Действительно. Глупость написал. Вариант не работает, если делать запись в более чем 1 переменную.
Отредактированно dodger778 (23.01.2012 18:18:29)
Неактивен