[英]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.