MySQL Trigger - Хранение ВЫБОРА в переменной

53
задан Kenny Linsky 30 July 2012 в 04:23
поделиться

4 ответа

Можно объявить локальные переменные в триггерах MySQL, с DECLARE синтаксис.

Вот пример:

DROP TABLE IF EXISTS foo;
CREATE TABLE FOO (
  i SERIAL PRIMARY KEY
);

DELIMITER //
DROP TRIGGER IF EXISTS bar //

CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE x INT;
  SET x = NEW.i;
  SET @a = x; -- set user variable outside trigger
END//

DELIMITER ;

SET @a = 0;

SELECT @a; -- returns 0

INSERT INTO foo () VALUES ();

SELECT @a; -- returns 1, the value it got during the trigger

при присвоении значения переменной необходимо удостовериться, что запрос возвращает только единственное значение, не ряд строк или ряда столбцов. Например, если Ваш запрос возвращает единственное значение на практике, это хорошо, но как только это возвращает больше чем одну строку, Вы добираетесь" ERROR 1242: Subquery returns more than 1 row".

можно использовать LIMIT или MAX(), чтобы удостовериться, что локальная переменная установлена на единственное значение.

CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE x INT;
  SET x = (SELECT age FROM users WHERE name = 'Bill'); 
  -- ERROR 1242 if more than one row with 'Bill'
END//

CREATE TRIGGER bar AFTER INSERT ON foo
FOR EACH ROW BEGIN
  DECLARE x INT;
  SET x = (SELECT MAX(age) FROM users WHERE name = 'Bill');
  -- OK even when more than one row with 'Bill'
END//
49
ответ дан Bill Karwin 7 November 2019 в 08:50
поделиться
`CREATE TRIGGER `category_before_ins_tr` BEFORE INSERT ON `category`
  FOR EACH ROW
BEGIN
    **SET @tableId= (SELECT id FROM dummy LIMIT 1);**

END;`;
7
ответ дан Bill the Lizard 7 November 2019 в 08:50
поделиться

Или можно просто включать оператор SELECT в SQL, в котором это вызывает триггер, таким образом, ее переданный как один из столбцов в триггерной строке (строках). Пока Вы уверены, что это непогрешимо возвратит только одну строку (следовательно одно значение). (И, конечно, это не должно возвращать значение, которое взаимодействует с логикой в триггере, но это правда в любом случае.)

2
ответ дан dkretz 7 November 2019 в 08:50
поделиться
CREATE TRIGGER clearcamcdr AFTER INSERT ON `asteriskcdrdb`.`cdr` 
FOR EACH ROW
BEGIN
  SET @INC = (SELECT sip_inc FROM trunks LIMIT 1);
  IF NEW.billsec >1 AND NEW.channel LIKE @INC 
    AND NEW.dstchannel NOT LIKE "" 
  THEN
    insert into `asteriskcdrdb`.`filtre` (id_appel,date_appel,source,destinataire,duree,sens,commentaire,suivi) 
      values (NEW.id,NEW.calldate,NEW.src,NEW.dstchannel,NEW.billsec,"entrant","",""); 
  END IF;
END$$

Не пробуйте это @ home

6
ответ дан 7 November 2019 в 08:50
поделиться
Другие вопросы по тегам:

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