2010-07-08 121 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;