Итак, я использую Postgresql, и я хочу сделать следующее:
Скажем, у нас есть 2 таблицы, инвентарь и список покупок
create table inventory
(item_id serial primary key,
name text not null,
quantity int not null,
price int not null);
insert into inventory values
(1,'a',44,10000),
(2,'b',12,12000),
(3,'c',11,5000),
(4,'d',6,3000);
create table buyList
(buy_id serial primary key,
item_id not null references inventory(item_id),
quantity int not null);
insert into buyList values
(1,2,4),
(2,2,5),
(3,1,1);
, поэтому я хочу, чтобы значение inventory.quantity вычиталось из buyList.quantity соответствующего элемента (на основе item_id ofcourse)
например, если кто-то покупает 4 предмета «а», то значение столбца количества предмета «а» в таблице инвентаря будет 40 (автоматически обновляется).
РЕДАКТИРОВАТЬ:
СПАСИБО ОГРОМНОЕ к krithikaGopalakrisnan за ответ,
поэтому я использую триггер, сделанный krithikaGopalakrisnan (и немного изменил его)
CREATE OR REPLACE FUNCTION trigger() RETURNS trigger AS $$
BEGIN
UPDATE inventory SET quantity = quantity-NEW.quantity WHERE inventory.item_id = NEW.item_id ;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DO $$
DECLARE
BEGIN
EXECUTE format('CREATE TRIGGER trigger BEFORE INSERT OR UPDATE ON buylist FOR EACH ROW WHEN (pg_trigger_depth() = 0) EXECUTE PROCEDURE trigger()');
END;
$$ LANGUAGE plpgsql;
Но теперь возникает новая проблема, когда количество предмета в таблице инвентаря (inventory.quantity) равно 0, и происходит новая покупка этого предмета в таблице buylist, инвентарь. Количество этого предмета становится отрицательное число! (конечно, у нас этого не может быть), как я могу это исправить, чтобы, когда количество предметов равнялось 0 в таблице инвентаризации, таблица buylist не могла принять другой кортеж, указывающий, что кто-то покупает этот предмет (возможно, функцию для возврата ошибки сообщение или что-то)
спасибо заранее, я все еще новичок, поэтому буду очень признателен за любую помощь и руководство от вас, ребята.