问题描述
您好,我正在尝试为有2张桌子,carros和faturas的汽车创建一个库存数据库,所以soo carros是汽车的名称(veiculo)以及我有多少汽车(quantidade)和我售出了多少汽车( vendidos),而餐桌上的faturas具有ID和汽车名称(veiculo),其余的与我的目标无关。 我的目标是在餐桌上的法塔拉汽车上插入汽车名称(veiculo)后,它会进入carros表,并向该汽车的vendidos添加+1,但现在它正在更新我的所有vendidos行。 这是我的代码,希望您能为我提供帮助,谢谢。
CREATE TABLE carros (
veiculo VARCHAR(10) not null,quantidade INTEGER not null,vendidos INTEGER,PRIMARY KEY (veiculo));
CREATE TABLE faturas (
id serial not null,veiculo VARCHAR(10) NOT NULL,matricula VARCHAR(10) NOT NULL,nome CHAR(30) NOT NULL,contacto VARCHAR(15) NOT NULL,valor INT NOT NULL,PRIMARY KEY (id),FOREIGN KEY (veiculo) REFERENCES carros(veiculo));
CREATE OR REPLACE FUNCTION public.stockupdate()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
begin
IF EXISTS(select c.veiculo from carros c,faturas f where c.veiculo = f.veiculo limit 1) THEN
UPDATE carros SET vendidos = vendidos + 1 from faturas where carros.veiculo = faturas.veiculo;
end if;
return new;
end;
$function$
;
CREATE OR REPLACE FUNCTION public.stockupdate()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
begin
IF EXISTS(select c.veiculo from carros c,faturas f where c.veiculo = f.veiculo limit 1) THEN
UPDATE carros SET vendidos = vendidos + 1 from faturas where carros.veiculo = faturas.veiculo;
end if;
return new;
end;
$function$
;
create trigger stockupdatetrigger
before insert
on faturas
for each row
execute procedure stockupdate();
INSERT INTO carros
(veiculo,quantidade,vendidos)
VALUES('Opel',10,0);
INSERT INTO carros
(veiculo,vendidos)
VALUES('Fiat',0);
INSERT INTO public.faturas
(veiculo,matricula,nome,contacto,valor)
VALUES('Opel','ABC 123','Ruben','226-255243',15000);
CREATE TABLE faturas (
id serial not null,FOREIGN KEY (veiculo) REFERENCES carros(veiculo)
);
CREATE OR REPLACE FUNCTION public.stockupdate()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
begin
IF EXISTS(select c.veiculo from carros c,15000);
解决方法
您似乎在这里使事情变得过于复杂。我认为您要编写的触发函数只是:
create or replace function public.stockupdate()
returns trigger
language plpgsql
as $$
begin
update carros set vendidos = vendidos + 1 where veiculo = new.veiculo;
return new;
end;
$$;
伪表new
可用于访问要插入的行。您可以使用它来过滤carros
表并更新相应的记录(如果有的话)