作为为生产中的大型表创建主键的一部分,我创建了一个可为空的
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
值吗?与并发插入相比,使用序列回填所有行的最佳方法是什么?
id IS NULL
同时保持安全?
您可以使用 nextval() 更新当前记录
UPDATE my_table
SET id = nextval('my_table_id_seq')
WHERE id IS NULL;
索引的维护由数据库完成,不会出现并发问题。只是不要期望您的数字有任何顺序,这些只是数字,没有任何附加含义。