gpt4 book ai didi

sql - 更新后如何在 Postgres 中使用触发器?

转载 作者:行者123 更新时间:2023-11-29 13:31:00 26 4
gpt4 key购买 nike

大家好我需要你们的帮助: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) 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

最佳答案

触发器的参数只能是字符串文字。简单名称和数值在编译时转换为字符串。使用这些参数无法完成您想要的。幸运的是,有一种更简单的方法。在触发器内部,有一个名为 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

关于sql - 更新后如何在 Postgres 中使用触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23310842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com