如何在postgresql中将DELETE的返回值插入INSERT?

lan*_*rat 17 postgresql sql-insert sql-delete

我试图从一个表中删除一行,并将一些额外的数据插入另一个表.我知道这可以在两个单独的命令中完成,一个用于删除,另一个用于插入新表.但是我试图将它们组合起来并且它不起作用,这是我目前的查询:

insert into b (one,two,num) values delete from a where id = 1 returning one, two, 5;

运行时,我收到以下错误:

错误:"删除"或附近的语法错误

任何人都可以指出如何实现这一目标,还是有更好的方法?还是不可能?

Pet*_*aut 45

你不能在PostgreSQL 9.1之前做到这一点,它还没有发布.然后语法就是

WITH foo AS (DELETE FROM a WHERE id = 1 RETURNING one, two, 5)
    INSERT INTO b (one, two, num) SELECT * FROM foo;
Run Code Online (Sandbox Code Playgroud)


Tom*_*zky 6

在PostgreSQL 9.1之前,您可以创建这样的volatile函数(未经测试):

create function move_from_a_to_b(_id integer, _num integer)
returns void language plpgsql volatile as
$$
  declare
    _one integer;
    _two integer;
  begin
    delete from a where id = _id returning one, two into strict _one, _two;
    insert into b (one,two,num) values (_one, _two, _num);
  end;
$$
Run Code Online (Sandbox Code Playgroud)

然后使用select move_from_a_to_b(1, 5).函数优于两个语句,它总是在单个事务中运行 - 不需要在客户端代码中显式启动和提交事务.