我想知道如果在我发布更新时数据库中不存在该行,是否有更新错误的方法。
update users set email='aa@bb.com' where id=200
如果users表没有id = 200的用户,那么postgres只会说" UPDATE 0"。但是,我想知道我是否可以收到错误。这样,我不必向数据库发出2个请求,一次检查存在,一次更新。如果我们单独进行更新,在检查存在和发布更新之间也可能存在竞争条件。
为什么我需要错误?很简单 - 所以客户知道他们使用了无效的用户ID,他们采取了纠正措施。
答案 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);