【问题标题】:Reset PostgreSQL primary key to 1将 PostgreSQL 主键重置为 1
【发布时间】:2011-04-18 16:06:37
【问题描述】:

有没有办法将 PostgreSQL 表的主键重置为在填充表上重新从 1 开始?

现在它正在生成 1000000 及以上的数字。我希望它全部重置并从 1 开始,保持我所有现有数据的完整性。

【问题讨论】:

    标签: postgresql primary-key reset


    【解决方案1】:

    重置序列以从数字 1 开始的最佳方法是执行以下操作:

    ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1
    

    因此,例如对于users 表,它将是:

    ALTER SEQUENCE users_id_seq RESTART WITH 1
    

    【讨论】:

    • WITH 1参数是多余的,可以省略
    • 这是唯一正确的答案,因为它确实重置了序列。
    • CREATE TABLE子句自动生成的索引的大问题,就是我们不知道名字(而且后缀不是seq,可以pk等.)... 但是通过\d my_table_name 在 psql 上很容易。或通过 SQL 检查,SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
    • 在这个问题上打我的头。如果表中有数据并且您希望它从上次停止的地方开始,您仍然希望传递WITH 1 或将其忽略。如果您指定WITH 123 或任何当前最高值,它将将该值添加到您的下一行。可能不是你想要的。
    • 我需要在序列标识符前面加上模式名称,否则我得到“关系'tablename_id_seq'不存在”。这个命名约定可以通过 "\d " 和 id 列的默认值 (nextval...) 来查找。所以基本上就我而言ALTER SEQUENCE auth.roles_id_seq RESTART WITH 5;
    【解决方案2】:

    在此处查看更好的选择:https://stackoverflow.com/a/5272164/5190

    自动递增的主键(即数据类型为serial primary key 的列)与sequence 关联。您可以使用setval(&lt;seqname&gt;, &lt;next_value&gt;) 函数为任何序列设置下一个值。请注意,要自己实际执行该函数,您需要使用SELECT,如下所示:SELECT setval(&lt;seqname&gt;, &lt;next_value&gt;)

    使用串口时自动创建的序列名称为&lt;table&gt;_&lt;column&gt;_seq

    【讨论】:

    • 您需要在调用前加上“SELECT”,例如SELECT setval('table_id_seq', 10000)
    • 如果我这样做SELECT setval('table_id_seq', 1),当我插入一条新记录时,id 的值为 2,而不是 1。Paweł Gościcki's solution 有效。 (PostgreSQL 9.3)
    • @bluish 大概是在分配新的主键之前序列号增加了,即。您需要将其重置为 0。但我同意其他解决方案更好。
    【解决方案3】:

    TRUNCATE TABLE table_name RESTART IDENTITY;

    【讨论】:

      【解决方案4】:

      @bluish 实际上使用自动递增的主键插入新记录,就像以这种方式显式使用序列一样:

      INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)
      

      所以,如果你想让第一个 id 为 1,你应该将你的序列设置为 0。但是它超出了界限,所以你必须使用 ALTER SEQUECE 语句。 因此,如果您的表格菜单中有一个名为 number 的序列字段,例如:

      ALTER SEQUENCE menu_number_seq RESTART
      

      将完美地完成这项工作。

      【讨论】:

        猜你喜欢
        • 2011-10-21
        • 2014-01-02
        • 1970-01-01
        • 2019-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        相关资源
        最近更新 更多