在增加值的同时选择和更新表中的行

时间:2018-10-04 17:14:50

标签: sql postgresql

我有一个要添加sort_order列的数据库表。我想遍历表中的每一行并设置sort_order,同时将其值增加1。

伪:

UPDATE captions set sort_order++ where category_id = ?

我可以通过什么方式实现这一目标?

3 个答案:

答案 0 :(得分:1)

您可以使用序列:

create sequence my_seq1;

UPDATE captions set sort_order = nextval('my_seq1') where category_id = ?

答案 1 :(得分:0)

DECLARE
  v_sort_order NUMBER := 1;
BEGIN
  FOR i IN
  ( SELECT category_id FROM captions ORDER BY <column names>
  );
  LOOP
    UPDATE captions
    SET sort_order    = v_sort_order
    WHERE category_id = i.category_id;
    v_sort_order     := v_sort_order +1;
  END LOOP;
EXCEPTION
WHEN OTHERS THEN
  raise_application_error(-20501,'error'||SQLCODE||sqlerrm);
END;

这个PL-SQL块应该可以做。

在i中输入(从字幕中选择category_id ORDER BY); 这将选择字幕表的所有列。

在order by子句中,用您要排序的实际列名替换。 更新语句将更新所有选定的行。

答案 2 :(得分:0)

或者,您可以使用ROW_NUMBER窗口函数:

WITH caption_rn AS
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY caption_id) AS rn
    FROM captions
)
UPDATE captions
SET sort_order = caption_rn.rn
FROM caption_rn
WHERE captions.caption_id = caption_rn.caption_id