【问题标题】:Change the starting value of a serial - Postgresql更改序列的起始值 - Postgresql
【发布时间】:2013-05-03 15:50:37
【问题描述】:

我对序列号有一点问题:从一个文件中,我填写了我的数据库,其中我有一个客户端 ID(它是一个序列号,它是我的主键)。我有 300 个客户,所以有 300 个客户 ID(1 到 300)。现在我的问题是,我有一个新客户的表单。我无法添加它们,因为当我添加客户时,我的程序会添加 ID 为 1 的客户,或者 ID 1 已分配给另一个客户。

所以我的问题是:是否可以更改序列的起始值来解决这个问题?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您可以使用RESTART WITH更改序列号以更改当前序列号;

    ALTER SEQUENCE test_seq RESTART WITH 300;
    

    如果您使用 serial 关键字创建序列名称,请使用

    SELECT adsrc FROM pg_attrdef WHERE adrelid = (SELECT oid FROM pg_class WHERE relname = 'table name goes here'); 
    

    An SQLfiddle to test with.

    【讨论】:

    • 所以要改变起始值,我需要创建一个序列。
    • @user1086267:serial由序列填充。请务必阅读手册。这一切都记录在那里。
    • @user1086267 如果您使用serial 关键字创建序列名称,请使用SELECT adsrc FROM pg_attrdef WHERE adrelid = (SELECT oid FROM pg_class WHERE relname = 'table name goes here');
    • adsrc 列在最新的 posgres 中不再存在
    【解决方案2】:

    PostgreSQL

    ALTER SEQUENCE tablename_columnname_seq RESTART WITH anynumber;
    

    例子:

    ALTER SEQUENCE test_table_rec_id_seq RESTART WITH 4615793;
    

    【讨论】:

      【解决方案3】:

      如果您的 Postgresql 版本高于上面的答案,您可以尝试使用 select pg_get_serial_sequence('ingredients', 'id'); 获取序列号

      SELECT adsrc FROM pg_attrdef WHERE adrelid = (SELECT oid FROM pg_class WHERE relname = 'ingredients');

      【讨论】:

        【解决方案4】:

        对于那些试图指向特定架构表的人,这里是您需要执行的查询。

        // To get the sequence name
        SELECT pg_get_serial_sequence('"yourSchema"."yourTable"', 'yourColumn');
        //Output: yourSchema."yourTable_yourColumn_seq"
        
        ALTER SEQUENCE yourSchema."yourTable_yourColumn_seq" RESTART WITH 100;
        

        【讨论】:

          【解决方案5】:

          上述解决方案无法满足我的需要。

          我需要一个序列号作为从 1000 开始的主键,而不是 1。

          为了做到这一点,我创建了一个标准序列列:

          ALTER table my_table ADD COLUMN new_id SERIAL PRIMARY KEY;
          

          然后更新该列:

          UPDATE my_table set new_id = new_id + 1000;
          

          然后我将该表加入到现有非连续 ID 编号小于 1000 的表中。

          【讨论】:

          • 是的@aclong 我也不确定为什么要投反对票。我可以说一年后我从未遇到过这种方法的任何问题。也许使用两列的组合作为 p 键会更好。它可能是PRIMARY KEY (source, serial_column),其中 source 是 ['source_1', 'source_2'] 并且 serial_column 是从 1 开始的两个串行列的并集,因此 'source_1, 1source_2, 1 是唯一的,但这不会很好用为了我的目的。喜欢的可以点赞:)
          猜你喜欢
          • 1970-01-01
          • 2015-10-04
          • 2012-11-19
          • 1970-01-01
          • 1970-01-01
          • 2014-12-03
          • 2017-12-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多