如何为PostgreSQL表指定主键种子?

5

我有一个包含数据的Postgres表,其中主键是由注入数据的代码设置的。假设主键为0..49。

我应该如何指示Postgres在下一次插入时从50开始使用主键列?目前,所有没有设置主键的插入都会产生重复的ID问题,因为它从0开始(我想)。

2个回答

4
PostgreSQL的“主键”实际上是在列上放置唯一约束(这也隐含地在该/这些列上放置索引)。据我所知,唯一约束与主键没有任何区别,只是名称不同;并且每个表只能有一个主键。它更多用于组织目的。
序列实际上是每次插入时迭代主键值的内容(如果我的设置假设正确)。
因此,您要做的是修改序列,将其“START”值设置为最后插入的值。
例如:更新现有序列。
SELECT SETVAL('name_of_my_sequence', 49);
  • SETVAL函数的第一个参数是要更新的序列名称。
  • 第二个参数是我们想要设置序列最后一个值的数字。表中的下一个插入将使用比此处设置的值更高的值。

示例:创建新序列

CREATE SEQUENCE name_of_my_sequence
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 49 -- Tell the sequence to start off at 49, so the next insert will be 50.
  CACHE 1

如果您不知道序列的名称,我强烈建议安装PgAdmin。在那里,展开相关表格并扩展“列”选项。单击具有序列的列,在右上方窗格中查看“默认值”。您应该会看到类似于nextval('name_of_my_sequence'::regclass)的值。无论name_of_my_sequence是什么,它都是您序列的名称。
如果您还没有设置序列,请使用上述示例创建序列。然后,您只需要右键单击列,然后单击“属性”。在“定义”选项卡下,输入类似于nextval('name_of_my_sequence'::regclass)的内容,就可以开始使用了!如果遇到任何问题或有其他问题,请告诉我!

4
所有你需要做的就是创建一个以50为起始值的序列,并将主键列的默认值设置为序列的下一个值。
以下是代码:
CREATE SEQUENCE seq_name START 50;
ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT nextval(seq_name);

我进行了编辑并引用了nextval参数,在我的psql环境中需要这个参数。 - Stan Wiechers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接