postgresql 无法从postgres中的UPDATE RETURNING子句进行SELECT

ac1kyiln  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(7)|浏览(184)

我把这个问题从一个复杂得多的查询中分离出来。下面是测试场景:

DROP TABLE test; 
CREATE TABLE test (
  id integer,
  description varchar(100)
);

INSERT INTO test(id, description) VALUES (1,'new'); 
INSERT INTO test(id, description) VALUES (2,'new');

如果我运行查询:

SELECT * FROM test WHERE id IN (UPDATE test set description='test' RETURNING id)

我得到以下错误:
错误:“test”行1处或附近的语法错误:SELECT * FROM test WHERE id(UPDATE test set description='test' RE... ^
费勒先生你好
ERROR:syntax error at or near“test”SQL Status:42601
但是如果我只运行语句

UPDATE test set value='test' RETURNING id

我得到一个有两行的结果:
十二
如果我替换这个结果,我会得到一个类似于以下的查询:

SELECT * FROM test WHERE id IN (1,2);

结果是:
1;“test”2;“test”
为什么我的初始语句没有得到相同的结果?

xnifntxz

xnifntxz1#

在PostgreSQL 9之前。1 INSERT/UPDATE/DELETE只能用作顶级语句。这就是为什么你得到一个语法错误。
从9开始。1可以将数据修改语句与公用表表达式一起使用。您的示例查询如下所示:

WITH updated AS (UPDATE test SET description = 'test' RETURNING id)
SELECT * FROM test WHERE id IN (SELECT id FROM updated);

从刚刚修改的表中选择时要小心。你可能会得到令人困惑的结果。因为查询是在同一个快照中执行的,所以SELECT不会看到UPDATE语句的效果。

sf6xfgos

sf6xfgos2#

UPDATE查询中更新两行,添加WHERE子句以限制受影响的行。

UPDATE test SET description = 'test' WHERE id = 1 RETURNING id

返回single row

csbfibhn

csbfibhn3#

UPDATE test set description='test' RETURNING *

将为您提供初始查询所期望的结果集。
但我怀疑你想做更复杂的事?

hgncfbus

hgncfbus4#

您是否缺少IN... WHERE id IN (UPDATE ...
但是,如果我只运行语句“UPDATE test set value='test' RETURNING id”,我会得到一个2行的结果。为什么会这样呢?
UPDATE没有WHERE子句,因此它更新每一行,其中有两行。

whitzsjs

whitzsjs5#

你没有限制你的where子句。你需要有id =(blahblah)或id IN(blahblah)

vsdwdz23

vsdwdz236#

DROP TABLE IF EXISTS test_tab;

CREATE TABLE test_tab (
  id integer,
  description varchar(100)
);

INSERT INTO test_tab(id, description) VALUES (1,'new'); 
INSERT INTO test_tab(id, description) VALUES (2,'new'); 

SELECT * from test_tab;

DO $$
DECLARE
    myID    test_tab.id%TYPE;
    testID  test_tab.id%TYPE;
    cur_IDs CURSOR for select id from test_tab;
BEGIN
    OPEN cur_IDs;
    LOOP
        FETCH cur_IDs into testID;
        EXIT WHEN testID is NULL;

        UPDATE test_tab SET description='test' WHERE id = testID RETURNING id into myID;
        raise notice 'myID %', myID;
    END LOOP;
    CLOSE cur_IDs;
END$$;

DROP TABLE IF EXISTS test_tab;
6jjcrrmo

6jjcrrmo7#

我是蚂蚁Aasma的加法,如果在同一个表上选择,使用:

WITH updated AS (UPDATE test SET description = 'test' RETURNING id, description)
SELECT * FROM updated;

相关问题