Postgres - 如果找不到记录,则更新时返回错误

sat*_*sat 14 postgresql

我想知道如果在我发布更新时数据库中不存在该行,是否有更新错误的方法.

update users set email='aa@bb.com' where id=200
Run Code Online (Sandbox Code Playgroud)

如果users表没有id = 200的用户,那么postgres只会说"UPDATE 0".但是,我想知道我是否可以收到错误.这样,我不必向数据库发出2个请求,一次检查存在,一次更新.如果我们单独进行检查,在检查存在和发布更新之间也可能存在竞争条件.

为什么我需要错误?很简单 - 因此客户知道他们使用了无效的用户ID并且他们采取了纠正措施.

Igo*_*nko 10

你可以使用类似的东西

update users set email='aa@bb.com' where id=200 returning id;
Run Code Online (Sandbox Code Playgroud)

此查询将返回id更新的行.如果它返回0行 - 那么在您的应用程序中抛出一个错误.

您还可以检查db驱动程序/框架是否返回受影响行的计数(如getUpdateCount()JDBC中).


kli*_*lin 7

您可以使用匿名代码块.

do $$
begin
    update users set email='aa@bb.com' where id=200;
    if not found then raise exception 'User not found';
    end if;
end $$;
Run Code Online (Sandbox Code Playgroud)

或常规功能:

create or replace function update_user(new_email text, user_id integer)
returns void language plpgsql 
as $$
begin
    update users set email = new_email where id = user_id;
    if not found then raise exception 'User id % not found', user_id;
    end if;
end $$;    

select update_user('aa@example.com', 200);
Run Code Online (Sandbox Code Playgroud)