2010-07-08 50 views
1

我想在UPDATE语句中的UPDATE中使用PostgreSQL的RETURNING子句,并且遇到了麻烦。是否将UPDATE中的RETURNING子句用作INSERT查询子句的查询子句?

Postgres允许一个查询子句在INSERT,例如:

INSERT INTO films 
SELECT * FROM tmp_films WHERE date_prod < '2004-05-07'; 

我想用的返回子句从UPDATE作为INSERT查询子句,例如:

INSERT INTO user_status_history(status) 
UPDATE user_status SET status = 'ACTIVE' WHERE status = 'DISABLED' RETURNING status 

我发现的所有Postgres引用都表明,RETURNING子句的行为与SELECT子句完全相同,但是当我运行类似上述的操作时,我得到以下内容:

ERROR: syntax error at or near "UPDATE"

LINE 2: UPDATE user_statuses

尽管能够无误地执行上述查询的UPDATE部分。

是否将UPDATE中的RETURNING子句用作INSERT查询子句的查询子句?

目标是更新一个表,并在可能的情况下使用单个查询插入另一个表。

回答

1

现在,没有。

有一个功能,几乎使其成为PostgreSQL 9.0称为Writeable CTE's这就是你所想的(虽然语法不同)。

目前,您可以通过触发器或两个单独的语句来执行此操作。

+0

CTE现在是9.1和更高版本的PostgreSQL的一部分。 – 2013-08-19 18:21:37

0

我认为这是不可能的,你试图做的方式。 我建议你写一个AFTER UPDATE触发器,然后可以执行插入操作。

2

在PostgreSQL 9.1(或更高)可能会使用新的功能,它允许数据修改命令(INSERT /更新/删除)在WITH clauses,如:

WITH updated_rows AS 
(
    UPDATE products 
    SET ... 
    WHERE ... 
    RETURNING * 
) 
INSERT INTO products_log 
SELECT * FROM updated_rows; 

在PostgreSQL 9.0(或更低)您可以将UPDATE命令嵌入到一个函数中,然后从执行INSERT命令的另一个函数中使用该函数,例如:

FUNCTION update_rows() 
RETURNS TABLE (id integer, descrip varchar) 
AS $$ 
BEGIN 
    RETURN QUERY 
     UPDATE products 
     SET ... 
     WHERE ... 
     RETURNING *; 
END; 
$$ LANGUAGE plpgsql; 

FUNCTION insert_rows() 
RETURNS void 
AS $$ 
BEGIN 
    INSERT INTO products_log 
    SELECT * FROM update_rows() AS x; 
END; 
$$ LANGUAGE plpgsql;