繁体   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