我有一个postgres表,其中包含主键已由注入数据的代码设置的数据。所以假设主键是0..49。
如何指示postgres在下一次插入的主键列上以50开头?目前,所有没有设置主键的插入都会导致重复的ID问题,因为它从0开始(我假设)。
答案 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);
示例:创建新序列
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)
类似的内容,您应该好好去!如果您遇到任何问题或有任何其他问题,请告诉我们!