Как АВТОМАТИЧЕСКИ обновить значение столбца в зависимости от условия в столбце другой таблицы? - PullRequest
0 голосов
/ 30 октября 2018

Итак, я использую 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 не могла принять другой кортеж, указывающий, что кто-то покупает этот предмет (возможно, функцию для возврата ошибки сообщение или что-то)

спасибо заранее, я все еще новичок, поэтому буду очень признателен за любую помощь и руководство от вас, ребята.

1 Ответ

0 голосов
/ 30 октября 2018

Триггер это то, что вам нужно ..

    CREATE FUNCTION trigger() RETURNS trigger AS $$ 
    BEGIN 
    UPDATE inventory SET 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;


Sample data:

postgres=# select * from inventory;
 item_id | name | quantity | price 
---------+------+----------+-------
       1 | a    |       44 | 10000
       2 | b    |       12 | 12000
       3 | c    |       11 |  5000
       4 | d    |        6 |  3000
(4 rows)

postgres=# select * from buylist;
 buy_id | item_id | quantity 
--------+---------+----------
      1 |       2 |        4
      2 |       2 |        5
      3 |       1 |        1
(3 rows)

postgres=# update buylist set quantity=4 where item_id=1;

postgres=# select * from inventory;
 item_id | name | quantity | price 
---------+------+----------+-------
       2 | b    |       12 | 12000
       3 | c    |       11 |  5000
       4 | d    |        6 |  3000
       1 | a    |       40 | 10000

Надеюсь, это поможет

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