PostgreSQL更新某一行

时间:2018-01-14 05:59:01

标签: postgresql sql-update

我想更新某些行的'f'到't'的验证,但是当我执行此操作时它会更新所有行:

UPDATE
  news
SET
  verified = 't'
FROM
  (
    SELECT
        verified
        , ROW_NUMBER() OVER () AS rownum
    FROM
        news
  ) AS foo
WHERE
 rownum = 1 or rownum = 15 or rownum = 32 or rownum = 54;

有人能告诉我问题在哪里吗?感谢

1 个答案:

答案 0 :(得分:0)

从UPDATE子句的PostgreSQL文档:

  

当存在FROM子句时,实质上发生的是目标表连接到from_list中提到的表,并且连接的每个输出行代表目标表的更新操作。

因此,您的查询使用SELECT子句的结果创建新闻表的叉积,当然这也是新闻表(由于您的AS子句,我将称之为“foo”)。新闻表中的每一行都附有foo结果表中的每一行,创建nxn行,其中n是新闻中的行数。因此,对于每个新闻行,WHERE子句至少选择一个foo行。因此,新闻表的每一行都被修改。

我不清楚你要做什么。 (OVER参数可以为空吗?为什么在foo查询中选择验证?)但是您可能希望将每个foo行连接到WHERE子句中的正确新闻行,可能是主键。