如何将一个主键索引修改成串行的?
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 一起被删除,而不是留下一个孤立的序列。
我有一个 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 一起被删除,而不是留下一个孤立的序列。