UPDATE ... LIMIT 1没有PK的PostgreSQL

时间:2018-08-27 14:37:41

标签: sql postgresql

您能帮我为PostgreSQL创建SQL请求以更新没有主键的表中的 first 记录吗?

UPDATE "company"
SET "salary" = 6
WHERE "name" = 'x' AND "age" = 5 AND "address" = 'x' AND "salary" = 5
LIMIT 1;  

*请注意,表没有PK。这意味着可以完全相同的记录具有相同的值

3 个答案:

答案 0 :(得分:0)

简短的回答:您不能。如果“ WHERE”子句不能将选择范围限制为一行,那么您实际上就无法做您想做的事。

行是否具有数据库本身可以跟上的固有行ID?如果是这样,您也许可以使用它。

答案 1 :(得分:0)

表中的每一行都有一个tid类型的系统列ctid,代表该行的物理位置:,因此您可以使用ctid进行更新

UPDATE company
    SET salary = 6
    WHERE ctid =(0,1)

答案 2 :(得分:0)

您可以使用ctid来精确更新一行。 SQL表是无序的,因此没有“第一”行之类的东西,但是您可以将更新限制为一行:

UPDATE "company" c
    SET "salary" = 6
    WHERE "name" = 'x' AND "age" = 5 AND "address" = 'x' AND "salary" = 5 AND
          ctid = (SELECT ctid
                  FROM "company" c2
                  WHERE c2."name" = c."name" and c2."age" = c."age" and c2."address" = c."address" and c2."salary" = c."salary"
                  ORDER BY ctid
                  LIMIT 1
                 );

也就是说,我认为您应该努力修复表,而不是尝试处理只会继续导致问题的数据。