【问题标题】:How to modify a primary key index to become serial?如何修改主键索引成为串行?
【发布时间】:2021-10-09 17:00:18
【问题描述】:

我有一个表,它有一个我想成为 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

【问题讨论】:

  • 需要更多信息:1) Postgres 版本? 2)目前的PK类型是什么? 3)当前列是否有值,是否需要保留? 4) 如果需要保留它们,值的范围是多少?如果 Postgres 版本足够新,您可能需要查看 Identity

标签: postgresql indexing primary-key auto-increment


【解决方案1】:

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

例如,如果您有下表:

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');

然后,当您插入到表中时(不指定 id 列,或使用关键字DEFAULT),它将从该序列中选择下一个值。

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

【讨论】:

    【解决方案2】:

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

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

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

    .. 最后将序列附加到表中

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

    演示:db<>fiddle

    【讨论】:

    • 嘿,谢谢!我应该根据我的表和列命名“t_seq”还是某种愚蠢的名字?
    • @StéphanedeLuca 这只是序列的虚拟名称.. 它可以是任何东西:)
    猜你喜欢
    • 2020-12-28
    • 2021-08-03
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2016-07-07
    • 2021-11-23
    • 2014-06-28
    • 2017-05-29
    相关资源
    最近更新 更多