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

时间:2013-12-19 15:23:11

标签: database postgresql

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

如何指示postgres在下一次插入的主键列上以50开头?目前,所有没有设置主键的插入都会导致重复的ID问题,因为它从0开始(我假设)。

2 个答案:

答案 0 :(得分:4)

您需要做的就是创建一个带有start 50的序列,并将主键列的默认值设置为序列的下一个值

这是代码

CREATE SEQUENCE seq_name START 50;
ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT nextval(seq_name);

答案 1 :(得分:2)

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)类似的内容,您应该好好去!如果您遇到任何问题或有任何其他问题,请告诉我们!