给出如下表格:
+----+-----
| id | ...
+----+-----
| 4 | foo
| 2 | bar
| 7 | baz
| 5 | gux
| . | ...
| . | ...
| . | ...
| |
我想为其中的所有记录分配新的ID,以便它们建立序列
an = an-1 + 1; a0 = x
在这里定义x
。
例如将x
设置为8
,该表将变为
+----+-----
| id | ...
+----+-----
| 8 | foo
| 9 | bar
| 10 | baz
| 11 | qux
| . | ...
| . | ...
| . | ...
| |
UPDATE
语句看起来如何?
答案 0 :(得分:1)
但是,如果您是为了测试或完成非常具体的任务而这样做,并且知道可能的问题,则可以按以下顺序进行:
例如:x = 2000
CREATE SEQUENCE myseq START 2000;
update mytable set id = nextval('myseq');
很显然,您将失去原始的身份证订单。
答案 1 :(得分:1)
对于其他用例,我认为这是不可预测的,我同意@mnesarco的设计评论。综上所述,这是一个可能会完成您在问题中所描述的解决方案:
if char > middle:
return isIn(char, aStr[:midIndex])
else:
return isIn(char, aStr[midIndex + 1:])
我真正要注意的是,这说“按零排序行”(解析函数中的with baz as (
select
id, bar,
row_number() over (order by 1) as rn,
max (id) over (partition by 1) as max_id
from
foo
)
update foo
set
id = baz.max_id + baz.rn
from baz
where
foo.id = baz.id
)是一件很奇怪的事情。由于PostgreSQL用MVCC处理DML的方式,一次更新将使该行“到达表的末尾”。顺序永远不会是隐式的,因此,除非您明确说明为什么这些ID按该顺序排列,否则无法保证这将按您希望的方式分配ID。如果会有一些我们可以隐式排序的列,我会感觉好多了,那么我对这种解决您问题的方法会感到很好。