如何将一个主键索引修改成串行的?

How to modify a primary key index to become serial?

我有一个 table,它有一个主键,我想将其变成 SERIAL(自动递增)。

怎么做?

=> select * from information_schema.table_constraints where table_name='role';
 constraint_catalog | constraint_schema | constraint_name | table_catalog | table_schema | table_name | constraint_type | is_deferrable | initially_deferred | enforced 
--------------------+-------------------+-----------------+---------------+--------------+------------+-----------------+---------------+--------------------+----------
 XXXXXXXX           | public            | role_pkey       | XXXXXXXX      | public       | role       | PRIMARY KEY     | NO            | NO                 | YES

执行此操作的标准方法是使用 sequence.

创建一个序列并将起始值设置为主键的最后一个值

CREATE SEQUENCE t_seq INCREMENT BY 1;
SELECT setval('t_seq', (SELECT max(id) FROM role)); 

.. 最后你将序列附加到你的 table

ALTER TABLE public.role ALTER COLUMN id SET DEFAULT nextval('t_seq');

演示:db<>fiddle

它是主键这一事实与解决方案无关。您需要确定要使用序列的列中已使用的最大值,创建一个以高于该值的数字开始的序列,然后将该序列的所有权设置为该列。

例如,如果您有以下 table:

CREATE TABLE mytable (
  id INT NOT NULL PRIMARY KEY,
  content TEXT
);

如果 id 的最大值为 2500,您将执行以下操作:

CREATE SEQUENCE mytable_id_seq START 2501 OWNED BY mytable.id;

ALTER TABLE mytable ALTER COLUMN id SET DEFAULT nextval('mytable_id_seq');

然后,当您插入 table 时(未指定 id 列,或使用关键字 DEFAULT),它将 select 该序列的下一个值。

将序列的所有者设置为 table 列意味着如果您删除它,序列将与 table 一起被删除,而不是留下一个孤立的序列。