V
Size: a a a
V
VA
VA
u
+----+--------+----------+products
| id | name | quantity |
+----+--------+----------+
| 1 | овощи | 0 |
| 2 | фрукты | 0 |
+----+--------+----------+
+----+---------+------------+Я хочу при изменении таблицы products обновлять данные в categories. А именно менять quantity.
| id | name | categoryId |
+----+---------+------------+
| 1 | яблоко | 2 |
| 2 | банан | 2 |
| 3 | помидор | 1 |
+----+---------+------------+
CREATE TRIGGER products_triggerИ Функцию
AFTER event INSERT OR
UPDATE OF categoryId OR
DELETE
ON products
FOR EACH ROW
EXECUTE PROCEDURE update_categories()
CREATE FUNCTION update_categories(categoryId)И вот я хочу в функцию передать id категории из таблицы, за который следит триггер. Как я могу это сделать?
LANGUAGE sql
AS 'UPDATE categories SET quantity = (SELECT quantity FROM categories WHERE id = categoryId)'
D
+----+--------+----------+products
| id | name | quantity |
+----+--------+----------+
| 1 | овощи | 0 |
| 2 | фрукты | 0 |
+----+--------+----------+
+----+---------+------------+Я хочу при изменении таблицы products обновлять данные в categories. А именно менять quantity.
| id | name | categoryId |
+----+---------+------------+
| 1 | яблоко | 2 |
| 2 | банан | 2 |
| 3 | помидор | 1 |
+----+---------+------------+
CREATE TRIGGER products_triggerИ Функцию
AFTER event INSERT OR
UPDATE OF categoryId OR
DELETE
ON products
FOR EACH ROW
EXECUTE PROCEDURE update_categories()
CREATE FUNCTION update_categories(categoryId)И вот я хочу в функцию передать id категории из таблицы, за который следит триггер. Как я могу это сделать?
LANGUAGE sql
AS 'UPDATE categories SET quantity = (SELECT quantity FROM categories WHERE id = categoryId)'
D
u
u
D
CREATE OR REPLACE FUNCTION update_categories() RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
update_stmt text := format('UPDATE categories SET quantity = (SELECT quantity FROM categories WHERE id = $1)'::text);
BEGIN
IF TG_OP = 'DELETE' THEN
EXECUTE update_stmt USING OLD.category_id;
ELSE -- не уверен в синтаксисе
EXECUTE update_stmt USING NEW.category_id;
END IF;
RETURN NULL; -- на самом деле надо изучить, как return value триггера на каждое событие влияет на дальнейшую судьбу этого события
END;
$$;
идея такая :) если вам нужно - я могу посмотреть у себя примеры, как реально выглядит plpgsql т
акая :) если вам нужно - я могу посмотреть у себя примеры, как реально выглядит plpgsqlu
CREATE OR REPLACE FUNCTION update_categories() RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
update_stmt text := format('UPDATE categories SET quantity = (SELECT quantity FROM categories WHERE id = $1)'::text);
BEGIN
IF TG_OP = 'DELETE' THEN
EXECUTE update_stmt USING OLD.category_id;
ELSE -- не уверен в синтаксисе
EXECUTE update_stmt USING NEW.category_id;
END IF;
RETURN NULL; -- на самом деле надо изучить, как return value триггера на каждое событие влияет на дальнейшую судьбу этого события
END;
$$;
идея такая :) если вам нужно - я могу посмотреть у себя примеры, как реально выглядит plpgsql т
акая :) если вам нужно - я могу посмотреть у себя примеры, как реально выглядит plpgsqlD
CREATE TRIGGER
остаётся таким же, как был у васN
u
CREATE TRIGGER
остаётся таким же, как был у васa
RD
RD
Д
m
create table t( id int, arr int[])
при условии что хочется уникальности пар (id,arr), и быстрый поиск по (id, any element of arr)РА
create table t( id int, arr int[])
при условии что хочется уникальности пар (id,arr), и быстрый поиск по (id, any element of arr)Д