我想更新某些行的'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;
有人能告诉我问题在哪里吗?感谢
答案 0 :(得分:0)
从UPDATE子句的PostgreSQL文档:
当存在FROM子句时,实质上发生的是目标表连接到from_list中提到的表,并且连接的每个输出行代表目标表的更新操作。
因此,您的查询使用SELECT子句的结果创建新闻表的叉积,当然这也是新闻表(由于您的AS子句,我将称之为“foo”)。新闻表中的每一行都附有foo结果表中的每一行,创建nxn行,其中n是新闻中的行数。因此,对于每个新闻行,WHERE子句至少选择一个foo行。因此,新闻表的每一行都被修改。
我不清楚你要做什么。 (OVER参数可以为空吗?为什么在foo查询中选择验证?)但是您可能希望将每个foo行连接到WHERE子句中的正确新闻行,可能是主键。