ins*_*ity 0 sql postgresql select stored-procedures
所以,我正在尝试创建一个程序,它将在我的表中找到一个特定的行,将行保存在要返回的结果中,删除该行,然后返回结果.
我设法做的最好的事情是:
CREATE OR REPLACE FUNCTION sth(foo integer)
RETURNS TABLE(a integer, b integer, ... other fields) AS $$
DECLARE
to_delete_id integer;
BEGIN
SELECT id INTO to_delete_id FROM my_table WHERE sth_id = foo LIMIT 1;
RETURN QUERY SELECT * FROM my_table WHERE sth_id = foo LIMIT 1;
DELETE FROM my_table where id = to_delete_id;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
如你所见,我有2个SELECT
操作几乎做同样的事情(额外的开销).有没有办法让第二个SELECT
也设置,to_delete_id
所以我可以删除之后的行?
你只想要一个DELETE ... RETURNING.
DELETE FROM my_table WHERE sth_id=foo LIMIT 1 RETURNING *
Run Code Online (Sandbox Code Playgroud)
根据ahwnn的评论编辑.非常正确 - 教我剪切+粘贴查询而不正确阅读.
DELETE FROM my_table WHERE id = (SELECT id ... LIMIT 1) RETURNING *
Run Code Online (Sandbox Code Playgroud)