大家好我需要你的帮助: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引用的quantita是可用数量减去订购数量。
例如:
我有这个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
答案 0 :(得分:1)
触发器的参数只能是字符串文字。简单名称和数值在编译时转换为字符串。使用这些参数无法完成您想要的任务。幸运的是,有一种更简单的方法。在触发器内部有一个名为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