用序列回填可为空的列

问题描述 投票:0回答:1

作为为生产中的大型表创建主键的一部分,我创建了一个可为空的

id
列,一个自动递增序列并将两者连接起来:

-- Add nullable column id
ALTER TABLE my_table ADD COLUMN IF NOT EXISTS id BIGINT;

-- Create a sequence
CREATE SEQUENCE my_table_id_seq;

-- Associate the sequence with the table
ALTER SEQUENCE my_table_id_seq OWNED BY my_table.id;

-- Use the sequence for new rows in this table
ALTER TABLE my_table ALTER COLUMN id SET DEFAULT nextval('my_table_id_seq');

执行此操作后,所有新行确实在

id
列上获得递增值。现在我需要用序列中的值回填所有以前存在的行。

我有一些担忧:

  • 我想对于
    id
    的值为
    NULL
    的每一行,我需要使用序列中的下一个值并增加索引,以避免使用相同的值两次。
  • 如果对该表进行并发插入怎么办 - 这会创建竞争条件并导致多个行具有相同的
    id
    值吗?
  • 一次性更新所有行可能需要很长时间 - 相反,我打算通过预先在 CTE 中选择要更新的行来批量更新 10K 行左右。

与并发插入相比,使用序列回填所有行的最佳方法是什么?

id IS NULL
同时保持安全?

postgresql primary-key
1个回答
0
投票

您可以使用 nextval() 更新当前记录

UPDATE my_table 
SET id = nextval('my_table_id_seq') 
WHERE id IS NULL;

索引的维护由数据库完成,不会出现并发问题。只是不要期望您的数字有任何顺序,这些只是数字,没有任何附加含义。

© www.soinside.com 2019 - 2024. All rights reserved.