更新数字列,以便其字段的值构建以x

时间:2019-02-16 02:18:43

标签: sql postgresql

给出如下表格:

+----+-----
| 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语句看起来如何?

2 个答案:

答案 0 :(得分:1)

  1. 具有可变的id是非常糟糕的设计。
  2. 如果x

但是,如果您是为了测试或完成非常具体的任务而这样做,并且知道可能的问题,则可以按以下顺序进行:

例如: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。如果会有一些我们可以隐式排序的列,我会感觉好多了,那么我对这种解决您问题的方法会感到很好。