簡體   English   中英

更新后如何在Postgres中使用觸發器?

[英]How to use trigger in Postgres after Update?

大家好,我需要您的幫助:D我正在使用最新版本的PostgreSQL首先,這是我的數據庫表:

CREATE TABLE colore (
  idcolore INTEGER PRIMARY KEY,
  nome VARCHAR(100),
  note TEXT
);

CREATE TABLE Prodotto (
    SKU varchar(50) PRIMARY KEY,
    nome varchar(255) NOT NULL,
    quantita INTEGER DEFAULT -1,
    idColore INTEGER,
    prezzo NUMERIC(10, 2),
    FOREIGN KEY(idColore) REFERENCES Colore(idColore) ON UPDATE NO ACTION ON DELETE NO ACTION
);

CREATE TABLE Ordine (
    idOrdine INTEGER PRIMARY KEY,
    SKU varchar(50) NOT NULL,
    quantita INTEGER NOT NULL,
    CHECK (check_quantita(SKU, quantita)),
    FOREIGN KEY(SKU) REFERENCES Prodotto(SKU) ON UPDATE NO ACTION ON DELETE NO ACTION
);

我想要的是,當我插入一個新的Ordine時,SKU對Prodotto引用的量化是可用數量減去訂購數量。

例如:

我有這個Prodotto:

SKU : AAA
Nome: Prodotto1
Quantita: 11

然后執行以下操作:將Ordine(idOrdine,SKU,Quantita)值插入(1,“ AAA”,10);

我想要的是在最后一次插入后,產品AAA的數量將為1。

我試過使用這段代碼

CREATE OR REPLACE FUNCTION aggiorna_quantita() RETURNS trigger AS
$$
BEGIN
UPDATE Prodotto
    SET quantita = (SELECT Quantita FROM Prodotto WHERE SKU = TG_ARGV[0]) - TV_ARGV[$1]
    WHERE SKU = TV_ARGV[$0] ;
END
$$
LANGUAGE plpgsql;

CREATE TRIGGER trigger_aggiorna_quantita
AFTER INSERT ON Ordine
FOR EACH STATEMENT
EXECUTE PROCEDURE aggiorna_quantita(SKU, quantita);

但是什么也沒發生:(

預先謝謝您,請原諒我英語不好:D

觸發器的參數只能是字符串文字。 簡單名稱和數字值在編譯時會轉換為字符串。 使用這些參數無法完成您想要的操作。 幸運的是,有一種更簡單的方法。 在觸發器內部有一個名為NEW的變量,它是剛插入的行。

另外,您不必使用選擇來檢索Quantita的當前值。

哦,不要在postgresql中使用大寫字符作為對象名稱。 它對大寫字母的處理非常混亂,因為除非將名稱放在雙引號之間,否則它將把它們轉換為小寫字母。

而且,您還希望觸發器為行級而不是語句級。

因此,您的代碼將變為:

CREATE OR REPLACE FUNCTION aggiorna_quantita() RETURNS trigger AS
$$
BEGIN
UPDATE prodotto
    SET quantita = prodotto.quantita - NEW.quantita
    WHERE sku = NEW.sku;
    RETURN NEW;
END
$$
LANGUAGE plpgsql;

CREATE TRIGGER trigger_aggiorna_quantita
AFTER INSERT ON ordine
FOR EACH ROW
EXECUTE PROCEDURE aggiorna

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM