【问题标题】:Will a Postgres Serial Primary Key overwrite an existing primary key?Postgres 串行主键会覆盖现有主键吗?
【发布时间】:2022-01-18 21:03:46
【问题描述】:

我刚刚创建了一个新数据库并将所有数据从另一个数据库复制到新数据库中。在标题为“用户”的数据库表中,有一列标题为“用户 ID”,我已将其设置为“串行主键”,因此它会自动递增。

我刚刚注意到新用户的自动增量编号在数据库更改后重置为 1。

目前,最低的 user_id 编号为 13,最高为 568。在更改为新数据库之前,自动递增将继续超过数据库中的最高编号。但现在在新数据库中,它从 1 开始自动递增。

我的问题是,当自动增量达到 13 时,postgres 会自动跳过数字 13 跳到当前未使用的下一个可用数字吗?或者自动增量会使用数字 13,我将有两个具有相同 user_id 13 的用户?

【问题讨论】:

标签: sql postgresql


【解决方案1】:

序列值不会跳过 13,INSERT 将因主键冲突而失败。

加载数据后,应将序列计数器设置为高于表中实际主键最大值的值。

  • 找出使用的序列:

    SELECT pg_get_serial_sequence('users', 'user_id');
    

    假设结果是users_user_id_seq

  • 在表格中找出最大值:

    SELECT max(user_id) FROM users;
    
  • 将序列设置为更高的值:

    SELECT setval('users_user_id_seq', 1000000);
    

【讨论】:

  • 非常感谢!!!你刚刚让我的应用免于一团糟
猜你喜欢
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 2020-11-11
  • 2016-09-09
相关资源
最近更新 更多