【问题标题】:How to specify the primary key seed for a postgres table?如何为 postgres 表指定主键种子?
【发布时间】:2014-01-08 05:44:52
【问题描述】:

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

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

【问题讨论】:

    标签: database postgresql


    【解决方案1】:

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

    这是代码

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

    【讨论】:

    • 我进行了编辑并引用了 nextval 参数,它在我的 psql 环境中需要它。
    【解决方案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) 的内容,您应该一切顺利!如果您遇到任何问题或有任何其他问题,请告诉我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-09
      • 2016-02-20
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2021-03-03
      相关资源
      最近更新 更多