PostgreSQL 正在更新所有行
PostgreSQL is updating all rows
你好,我正在尝试为具有 2 tables、carros 和 faturas 的汽车创建库存数据库,soo carros 是汽车的名称(veiculo)以及我有多少辆汽车(quantidade)我卖了多少辆车(vendidos),table faturas 有 id 和车名(veiculo),其余的与我的 objective 无关。
我的 objective 是在我在 table faturas 上插入汽车名称(veiculo)之后,它转到了 carros table 并且它为那辆车的 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, 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;
$$;
Pseudo-table new
可用于访问正在插入的行。您可以使用它来过滤 carros
table 并更新相应的记录(如果有的话)
你好,我正在尝试为具有 2 tables、carros 和 faturas 的汽车创建库存数据库,soo carros 是汽车的名称(veiculo)以及我有多少辆汽车(quantidade)我卖了多少辆车(vendidos),table faturas 有 id 和车名(veiculo),其余的与我的 objective 无关。 我的 objective 是在我在 table faturas 上插入汽车名称(veiculo)之后,它转到了 carros table 并且它为那辆车的 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, 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;
$$;
Pseudo-table new
可用于访问正在插入的行。您可以使用它来过滤 carros
table 并更新相应的记录(如果有的话)