如何将DELETE返回插入postgresql中的insert?

如何将DELETE返回插入postgresql中的insert?,postgresql,sql-insert,sql-delete,Postgresql,Sql Insert,Sql Delete,我试图从一个表中删除一行,并将其与一些附加数据一起插入另一个表中。我知道这可以通过两个单独的命令来完成,一个用于删除,另一个用于插入到新表中。然而,我正在尝试将它们结合起来,但它不起作用,这是我目前的疑问: 插入b(一,二,num)值,从a中删除,其中id=1返回一,二,5 运行该命令时,我收到以下错误: 错误:“删除”处或附近出现语法错误 有人能指出如何做到这一点,或者有更好的方法吗?还是不可能?您在那里使用的语法无效。2个语句是最好的方法。最直观的方法是先做插入,然后删除第二。作为“Ai-W

我试图从一个表中删除一行,并将其与一些附加数据一起插入另一个表中。我知道这可以通过两个单独的命令来完成,一个用于删除,另一个用于插入到新表中。然而,我正在尝试将它们结合起来,但它不起作用,这是我目前的疑问:

插入b(一,二,num)值,从a中删除,其中id=1返回一,二,5

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

错误:“删除”处或附近出现语法错误


有人能指出如何做到这一点,或者有更好的方法吗?还是不可能?

您在那里使用的语法无效。2个语句是最好的方法。最直观的方法是先做插入,然后删除第二。

作为“Ai-W”,两个语句当然是你最好的选择,但是你也可以考虑为此写一个触发器。每次删除第一个表中的某些内容时,都会填充另一个表。

在尚未发布的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;

在PostgreSQL 9.1之前,您可以创建如下易失性函数(未经测试):


然后只需使用
选择move_from_a_to_b(1,5)
。与两条语句相比,函数的优势在于它总是在单个事务中运行—不需要在客户端代码中显式启动和提交事务。

对于所有版本的PostgreSQL,您可以创建一个触发器函数,用于从表中删除行并将其插入到另一个表中。但它似乎比PostgreSQL 9.1中发布的批量插入要慢。您只需在删除旧数据之前将其移动到另一个表中。这是使用旧数据类型完成的:

CREATE FUNCTION moveDeleted() RETURNS trigger AS $$
    BEGIN
        INSERT INTO another_table VALUES(OLD.column1, OLD.column2,...);
        RETURN OLD;
    END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER moveDeleted
BEFORE DELETE ON table 
    FOR EACH ROW
        EXECUTE PROCEDURE moveDeleted();
如上所述,在PostgreSQL 9.1之后,您可以执行以下操作:

WITH tmp AS (DELETE FROM table RETURNING column1, column2, ...)
    INSERT INTO another_table (column1, column2, ...) SELECT * FROM tmp;

非常感谢您的回答,当我转到9.1时,我将使用这个,因为现在托梅茨基的方法将不得不这样做。很好的回答,现在大多数人使用的版本都比9.1大得多。不需要触发器。文档中也有类似的示例,并介绍了一些。如果要移动某些行,请说明在何处添加
where
子句<代码>从返回的表中删除。。。
WITH tmp AS (DELETE FROM table RETURNING column1, column2, ...)
    INSERT INTO another_table (column1, column2, ...) SELECT * FROM tmp;