PostgreSQL正在更新所有行

PostgreSQL正在更新所有行,sql,postgresql,triggers,sql-update,sql-insert,Sql,Postgresql,Triggers,Sql Update,Sql Insert,您好,我正在尝试为有两个表的汽车创建一个库存数据库,carros和faturas,soo carros是汽车的名称(veiculo),我有多少辆汽车在库存(quantidade),我卖了多少辆汽车(vendidos),faturas表有id和汽车名称(veiculo),其余的与我的目标无关。 我的目标是在表faturas中插入汽车名称(veiculo)后,它进入carros表,并将+1添加到该汽车的vendidos,但现在它正在更新我的所有vendidos行。 这是我的代码,希望你能帮助我,谢谢

您好,我正在尝试为有两个表的汽车创建一个库存数据库,carros和faturas,soo carros是汽车的名称(veiculo),我有多少辆汽车在库存(quantidade),我卖了多少辆汽车(vendidos),faturas表有id和汽车名称(veiculo),其余的与我的目标无关。 我的目标是在表faturas中插入汽车名称(veiculo)后,它进入carros表,并将+1添加到该汽车的vendidos,但现在它正在更新我的所有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, quantidade, vendidos)
VALUES('Fiat', 10, 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,
    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 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, quantidade, vendidos)
VALUES('Fiat', 10, 0);

INSERT INTO public.faturas
(veiculo, matricula, nome, contacto, valor)
VALUES('Opel', 'ABC 123', 'Ruben', '226-255243', 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
表并更新相应的编码记录(如果有)