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

时间:2014-05-23 05:50:08

标签: postgresql

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

update users set email='aa@bb.com' where id=200

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

为什么我需要错误?很简单 - 所以客户知道他们使用了无效的用户ID,他们采取了纠正措施。

2 个答案:

答案 0 :(得分:9)

您可以使用类似

的内容
update users set email='aa@bb.com' where id=200 returning id;

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

另外,您可能想要检查数据库驱动程序/框架是否返回受影响的行数(如JDBC中的getUpdateCount())。

答案 1 :(得分:5)

您可以使用匿名代码块。

do $$
begin
    update users set email='aa@bb.com' where id=200;
    if not found then raise exception 'User not found';
    end if;
end $$;

或常规功能:

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);