как использовать после вставки триггеров в sql - PullRequest
0 голосов
/ 08 ноября 2018
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| _date  | varchar(20) | NO   | PRI | NULL    |       |
| petrol | int(11)     | NO   |     | NULL    |       |
| diesel | int(11)     | NO   |     | NULL    |       |
| gas    | int(11)     | NO   |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+

+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| _date1  | varchar(20) | NO   | PRI | NULL    |       |
| petrol1 | int(11)     | NO   |     | NULL    |       |
| diesel1 | int(11)     | NO   |     | NULL    |       |
| gas1    | int(11)     | NO   |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

Я новичок в триггерах и в целом в SQL и хотел использовать после триггера вставки, чтобы после ввода значений в таблицу «покупка», упомянутую выше. То же самое значение должно быть вставлено в таблицу «Sell» (также упомянуто выше), но после математической операции:

petrol+petrol*0.3, diesel+diesel*0.15, gas+gas*0.25

Я пытался использовать это:

CREATE TRIGGER t1
AFTER INSERT
ON buy
FOR EACH ROW
BEGIN
(
    INSERT INTO Sell (_date1, petrol1, diesel1, gas1)
    SELECT _date, petrol+petrol*0.3, diesel+diesel*0.15, gas+gas*0.25
    FROM inserted
)
END

Но потом он показал эту ошибку ниже:

ОШИБКА 1064 (42000): у вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса, чтобы использовать около 'после вставки на покупку для каждого ряда начать (вставить в Sell (_date1, petrol1, diese 'в строке 1

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Страница документа MySQL 8, на которую вы ссылаетесь

Прочитав, вы найдете следующие два утверждения:

В теле триггера, старые и новые ключевые слова позволяют вам получить доступ столбцы в строках, на которые воздействует триггер. СТАРЫЙ и НОВЫЙ - MySQL расширения для триггеров; они не чувствительны к регистру.

В триггере INSERT можно использовать только NEW.col_name; нет старого строка. В триггере DELETE может использоваться только OLD.col_name; здесь нет новый ряд В триггере UPDATE вы можете использовать OLD.col_name для ссылки на столбцы строки до ее обновления и NEW.col_name для ссылки на столбцы строки после ее обновления.

Так что с этим я полностью согласен с @Gordon Linoff

То, что вы ищете:

DELIMITER $$
CREATE TRIGGER t1 AFTER INSERT ON buy FOR EACH ROW
BEGIN
    INSERT INTO Sell (_date1, petrol1, diesel1, gas1)
    VALUES (NEW._date, NEW.petrol * 1.3, NEW.diesel * 1.15, NEW.gas * 1.25);
END $$
DELIMITER ;
0 голосов
/ 08 ноября 2018

Вы, кажется, хотите:

delimiter $$
create trigger t1 after insert on buy for each row
begin
    insert into Sell (_date1, petrol1, diesel1, gas1)
        values (new._date, new.petrol * 1.3, new.diesel * 1.15, new.gas * 1.25)
end;$$

delimiter ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...