【发布时间】:2012-12-10 15:16:31
【问题描述】:
我有一张下表:
+----+----------+----------+
| id | trail_id | position |
+----+----------+----------+
| 11 | 16 | NULL |
| 12 | 121 | NULL |
| 15 | 121 | NULL |
| 19 | 42 | NULL |
| 20 | 42 | NULL |
| 21 | 42 | NULL |
+----+----------+----------+
我正在寻找一种简单的方法来更新 position 递增整数( per parent )。所以完成后,表格应该是这样的:
+----+-----------+----------+
| id | trail_id | position |
+----+-----------+----------+
| 11 | 16 | 1 |
| 12 | 121 | 1 |
| 15 | 121 | 2 |
| 19 | 42 | 1 |
| 20 | 42 | 2 |
| 21 | 42 | 3 |
+----+-----------+----------+
我认为我需要的是一个函数,它循环遍历给定trail 的所有行,具有简单的递增索引并更新position 列。但是,我是 pgSQL 新手,所以我很高兴听到有更简单的方法可以做到这一点。
我现在尝试的解决方案是这样的
CREATE FUNCTION fill_positions(tid integer) RETURNS integer AS $$
DECLARE
pht RECORD;
i INTEGER := 0;
BEGIN
FOR pht IN SELECT * FROM photos WHERE photos.trail_id = tid LOOP
i := i + 1;
UPDATE photos SET position = i WHERE id = pht.id;
END LOOP;
RETURN i;
END;
$$ LANGUAGE plpgsql;
我很确定它可以更干净,并且不必使用函数。
【问题讨论】:
-
我稍微改变了我原来的问题。最初我认为执行由于某些错误而冻结,但事实并非如此。我正在使用一个 GUI 客户端,它的一个进程在尝试修改
photos表时冻结,这当然会为任何其他尝试更新它的进程锁定表。现在一切都很好,我发布的解决方案有效,我正在寻找更好的解决方案'
标签: sql postgresql plpgsql postgresql-9.2