gpt4 book ai didi

sql - 更改受更新影响的行数

转载 作者:行者123 更新时间:2023-11-29 13:09:19 24 4
gpt4 key购买 nike

我在这里试图实现的是基本上覆盖 0 行已更新,当 UPDATE 发出时,以防表中不存在实际的 PK/UK 值。这是我所做的:

实际表:

CREATE TABLE fdrgiit.vereine( 
team numeric(10) primary key,
punkte int not null,
serie int not null
);

虚拟表:

CREATE TABLE fdrgiit.dummyup 
(
id numeric(1) PRIMARY KEY,
datetest timestamp
);

在两个表中插入记录:

insert into vereine(team,punkte,serie) values(1, 50, 1); 
insert into vereine(team,punkte,serie) values(2, 30, 1);
insert into vereine(team,punkte,serie) values(3, 25, 1);
insert into vereine(team,punkte,serie) values(4, 37, 2);
insert into dummyup values(1, now());

创建了以下函数和触发器:

create or replace function updateover() 
returns trigger as
$BODY$
begin
if EXISTS (select 1 FROM vereine WHERE team = new.team ) then
RETURN NEW;
else
UPDATE fdrgiit.dummyup set datetest=now() where id=1;
RETURN NULL;
end if;
end;
$BODY$
LANGUAGE plpgsql;

create trigger update_redundancy
before update on vereine
for each row
execute procedure updateover() ;

但是当我在 上执行这样的更新时,我仍然 0 行受影响

update vereine set punkte=87 where team=5; 

请检查并建议这是否可以完成。

最佳答案

您不能使用不影响行的 UPDATE 触发任何内容,因为触发器仅针对受影响的行触发。

但是你可以包装你的选择 UPDATE进入一个函数:

CREATE OR REPLACE FUNCTION updateover()
RETURNS int AS
$func$
UPDATE dummyup
SET datetest = now()
WHERE id = 1
RETURNING 2;
$func$ LANGUAGE sql;

... 并运行您的 UPDATE像这样嵌套:

WITH upd AS (
UPDATE vereine
SET punkte = 87
WHERE team = 5 -- does not exist!
RETURNING 1
)
SELECT 1 FROM upd
UNION ALL
SELECT updateover()
LIMIT 1;

db<> fiddle here

如果没有行符合 UPDATE 的条件,然后是第一个外部 SELECT 1 FROM upd不返回任何行,Postgres 继续处理第二个 SELECT updateover() .但如果至少有一行受到影响,最后的 SELECT永远不会被执行。正是您想要的。

这会更新 dummyup 一次 如果 UPDATEvereine不影响任何行;从来没有几次。但没关系,因为now()STABLE在交易期间。

相关:

关于sql - 更改受更新影响的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56984331/

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