Как сделать запрос, который, при добавлении данных в одну таблицу, добавлял данные в другую?
Мне нужно написать тригер, которая при добавлении данных в таблицу с stage_id и name_of_stage (stages), он добавит данные и в таблицу с number_point, stage_id, point_name (points). Например, если я в stages добавляю данные (4, 'текст'), то в таблице points появятся (6, 4, 'ещё другой текст').
Мой код:
Ответы (1 шт):
Добро пожаловать! :-)
В таком виде триггер бессмысленный, но как я понял вам просто нужен рабочий пример. Тогда примерно так:
CREATE OR REPLACE FUNCTION after_insert_stage()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO points(number_point, stage_id, point_name)
SELECT COALESCE((SELECT MAX(number_point) + 1 FROM points), 1),
NEW.stage_id, 'tmp_name';
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER after_insert_stage AFTER INSERT ON stages FOR EACH ROW
EXECUTE FUNCTION after_insert_stage();
TRUNCATE TABLE points;
TRUNCATE TABLE stages;
INSERT INTO stages(stage_id, name_of_stage) VALUES(1,'111');
INSERT INTO stages(stage_id, name_of_stage) VALUES(2,'222');
INSERT INTO stages(stage_id, name_of_stage) VALUES(3,'333');
SELECT p.*, s.name_of_stage
FROM stages s
JOIN points p ON s.stage_id = p.stage_id;
Результат примерно такой:
"number_point" "stage_id" "point_name" "name_of_stage"
1 1 "tmp_name" "111"
2 2 "tmp_name" "222"
3 3 "tmp_name" "333"
ОБратите внимание на COALESCE((SELECT MAX(number_point) + 1 FROM points), 1) в триггерной функции, без COALESCE у вас все значения stage_id в таблице points будут NULL, когда начнёте заполнять пустую БД.
Собственно в вашем варианте ошибка была в том, что вы находили значение stage_id как максимальный из таблицы stages + 1.
Но по-скольку, триггер выполняется после INSERT, максимальное значение в таблице после операции INSERT...VALUES(4, 'gg') - будет равно 4, а добавив 1 поучим 5.
Правильней использовать ключевое слово NEW в теле триггерной функции. Как в примере.
Так же рекомендую в целом ознакомиться с тем, что такое триггер, кратко хотя бы тут:
https://postgrespro.ru/docs/postgrespro/9.6/plpgsql-trigger


