【问题标题】:How to use trigger in Postgres after Update?更新后如何在 Postgres 中使用触发器?
【发布时间】:2014-04-26 12:24:20
【问题描述】:

大家好,我需要你的帮助: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 引用的数量是可用数量减去订购的数量。

例如:

我有这个产品:

SKU : AAA
Nome: Prodotto1
Quantita: 11

然后我执行以下操作: INSERT INTO Ordine (idOrdine, SKU, quantita) VALUES (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

【问题讨论】:

    标签: sql database postgresql triggers plpgsql


    【解决方案1】:

    触发器的参数只能是字符串文字。简单名称和数值在编译时转换为字符串。使用这些参数无法完成您想要的操作。幸运的是,有一个更简单的方法。在触发器内部有一个名为 NEW 的变量可用,它是刚刚插入的行。

    您也不必使用 select 来检索 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多