Невозможно получить значение из запроса SELECT внутри триггера - PullRequest
0 голосов
/ 02 апреля 2012

Я пишу триггер, чтобы ОБНОВИТЬ строку в таблице ПОСЛЕ ВСТАВКИ в другую таблицу.Вот сценарии таблиц:

Таблица inv_cost

CREATE TABLE inv_cost (
  Username varchar(20) NOT NULL DEFAULT '',
  MachineType varchar(2) NOT NULL,
  Cost smallint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (Username,MachineType),
)

Таблица расследование

CREATE TABLE investigation (
  Username varchar(20) NOT NULL,
  MachineType varchar(2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DELIMITER ;;
CREATE TRIGGER TRG1 AFTER INSERT ON investigation FOR EACH ROW BEGIN
    DECLARE cost INT DEFAULT 0;
    SET cost = (SELECT Cost FROM inv_cost WHERE Username = NEW.Username AND MachineType = NEW.MachineType);
    UPDATE test SET Balance = Balance - cost WHERE Username = New.Username;
END;;
DELIMITER ;

Таблица исследователь

CREATE TABLE test (
  ID int(10) unsigned NOT NULL AUTO_INCREMENT,
  Username varchar(20) NOT NULL DEFAULT '',
  Balance smallint(6) DEFAULT NULL,
  PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
DELIMITER ;;
CREATE TRIGGER TRG2 AFTER UPDATE ON test FOR EACH ROW BEGIN
    IF NEW.Balance > OLD.Balance THEN
        INSERT INTO payments SET Username = NEW.Username, PaymentOn = NOW(), Amount = NEW.Balance - OLD.Balance;
    END IF;
END;;
DELIMITER ;

Проблема с триггером TRG1 заключается в том, что он не вычисляет значение переменной cost из оператора SELECT, ивсегда принимает значение 0 или что-либо еще установлено в DEFAULT в своем объявлении.Запрос UPDATE в следующей строке работает хорошо (с любым значением стоимость берется из его объявления ИЛИ, если ему присваивается постоянное значение, например SET cost = 100;).Отдельный прогон SELECT дает требуемое значение Стоимость .

Что не так с этим кодом?

Заранее спасибо.

1 Ответ

1 голос
/ 02 апреля 2012

Вы должны использовать синтаксис Поле ВЫБРАТЬ ИЗ таблицы ГДЕ условие В переменную

DROP TRIGGER TRG1 IF EXISTS;
DELIMITER $$
 CREATE TRIGGER TRG1
 AFTER INSERT ON investigation
 FOR EACH ROW BEGIN
      DECLARE cst smallint;
      SELECT Cost FROM inv_cost WHERE Username = NEW.Username AND MachineType = NEW.MachineType INTO cst;
      UPDATE test SET Balance = Balance - cst WHERE Username = New.Username;
 END$$
 DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...