PostgreSQL正在更新所有行

问题描述

您好,我正在尝试为有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表并更新相应的记录(如果有的话)