SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 17.05.2011 16:47:15

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Переменные в триггерах

Пишу триггер следующей функциональности: при апдейте данных таблицы X, необходимо инкрементировать значение соответствующей записи в таблице Y.
Заткнулся на том, что мне надо определить, существует ли соответствующая запись таблицы Y, или же её нужно сначала добавить.

Логика вида

SELECT @isset := `field_Y` FROM `table_Y` WHERE `field_Y`=NEW.`field_X`;
IF @isset IS NULL THEN
   INSERT INTO `table_Y` (`field_Y`) VALUES (NEW.`field_X`);
END IF;

порождает ошибку "Not allowed to return a result set from a trigger" на этапе создания триггера. Немного погуглив я понял, что писать значения в переменные с помощью SELECT в триггерах нельзя, можно юзать только SET.

А как тогда можно определить есть ли запись в таблице? Можно конечно сделать на таблице Y триггер "before update", но это вроде костыль получится. Какие рациональные решения есть по сабжу?


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#2 17.05.2011 17:44:38

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Переменные в триггерах

SET @isset := EXISTS(SELECT `field_Y` FROM `table_Y` WHERE `field_Y`=NEW.`field_X`);

Неактивен

 

#3 17.05.2011 17:55:49

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Переменные в триггерах

О как, большое спасибо smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#4 18.05.2011 11:49:51

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Переменные в триггерах

Чё-то не подумал я сразу... А значение поля в переменную всунуть? smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#5 18.05.2011 12:58:38

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Переменные в триггерах

SET @var := SELECT `field_Y` FROM `table_Y` WHERE `field_Y`=NEW.`field_X`;


работает?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 18.05.2011 13:09:05

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Переменные в триггерах

Так - нет, взял в скобки - заработало, спасибо smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#7 18.05.2011 13:12:41

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Переменные в триггерах

Ну и раз такая пьянка, давайте уже добъём ситуацию, авось пригодится в будущем... Занести значение нескольких полей одной выборки в переменные? wink


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#8 18.05.2011 13:23:45

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Переменные в триггерах


SET @X := '', @Y := '';
SELECT `field_X` into @X, `field_Y` into @Y FROM `table_Y` WHERE `field_Y`=NEW.`field_X`;
 

Отредактированно deadka (18.05.2011 13:24:16)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 18.05.2011 13:41:37

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Переменные в триггерах

Хм, о такой форме даже и не предполагал smile Проверять не буду, поверим на слово, спасибо за информацию smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#10 18.05.2011 13:43:29

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Переменные в триггерах

Пожалуйста smile. Просто в запросах такая форма работала, думаю, и в триггере сможет.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 31.05.2011 15:29:14

retro-kharkov
Участник
Зарегистрирован: 18.04.2011
Сообщений: 10

Re: Переменные в триггерах

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

если такого нет то вставит, иначе обновит

Неактивен

 

#12 01.06.2011 10:30:22

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Переменные в триггерах

Ну да, можно и так, спасибо smile
Кто-нибудь может описать плюсы и минусы каждого из подходов? Какой предпочтительнее и почему? Если нет разницы, то наверн лучше использовать меньше кода)))


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#13 02.06.2011 16:39:11

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Переменные в триггерах

INSERT ON DUPLICATE KEY UPDATE (если применим) в общем случае лучше, чем
SELECT + INSERT, т.к.
а) он атомарен в смысле доступа к данным (никто не удалит строку между запро-
сами из другого потока)
б) он один раз спускается по индексу до строки, а потом или вставляет новую, или
меняет (против двух раз при независимых запросах)

Неактивен

 

#14 03.06.2011 22:13:38

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Переменные в триггерах

Спасибо за информацию, учтём.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#15 10.06.2011 15:27:38

D.Demon
Участник
Зарегистрирован: 10.06.2011
Сообщений: 10

Re: Переменные в триггерах

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`;

А два одинаковых запроса делать для получения двух полей - как-то не по ФенШую smile

Неактивен

 

#16 10.06.2011 22:02:54

D.Demon
Участник
Зарегистрирован: 10.06.2011
Сообщений: 10

Re: Переменные в триггерах

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`;

Неактивен

 

#17 25.10.2011 13:12:23

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Переменные в триггерах

Понадобилось допилить существующий триггер, решил заодно заюзать конструкцию "INSERT ON DUPLICATE KEY UPDATE" вместо SELECT/INSERT, но оказалось не всё так просто в моём случае))

Дело в том, что у меня в UPDATE фигурируют разные поля в зависимости от значения NEW.`field`. Собственно вопрос, могу ли я в этом UPDATE дописать парочку ифов? smile В моём случае получается 3 действия:
1. Если NEW.`field` = Х, обновляем значение поля Х.
2. Если NEW.`field` = Y, обновляем значение поля Y.
3. Если NEW.`field` = Z, вобще ничего не обновляем.

Я так понимаю, в данном случае всё же придётся использовать отдельно SELECT/INSERT/UPDATE? smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#18 23.01.2012 16:03:17

dodger778
Участник
Зарегистрирован: 23.01.2012
Сообщений: 2

Re: Переменные в триггерах

Актуальна ли еще тема? Работа с переменными в триггерах у меня выглядит примерно так:


FOR EACH ROW BEGIN

 DECLARE var1 INTEGER(11) DEFAULT(0);
 DECLARE var2 INTEGER(11) DEFAULT(0);
 
 SELECT @var1:=filed1, @var2:=field2 FROM table

END;
 

Неактивен

 

#19 23.01.2012 16:45:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переменные в триггерах

var1 и @var1 это разные переменные.

Неактивен

 

#20 23.01.2012 18:16:49

dodger778
Участник
Зарегистрирован: 23.01.2012
Сообщений: 2

Re: Переменные в триггерах

vasya написал:

var1 и @var1 это разные переменные.

Нда... Действительно. Глупость написал. Вариант не работает, если делать запись в более чем 1 переменную.

Отредактированно dodger778 (23.01.2012 18:18:29)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson