【问题标题】:How to mimic a sequence in Postgres?如何模仿 Postgres 中的序列?
【发布时间】:2016-06-22 02:52:10
【问题描述】:

在应用程序中,我必须生成永远不会重复的数字,就像序列一样。因此,每次用户要求输入数字时,应用程序都必须返回最后生成的值加一,从不重复任何值

序列可以完美运行,除了每个新的一天生成的种子必须再次重置为 1。因此,今天应用程序从 1 开始生成数字,无论最后生成的值是什么,明天它都会再次从 1 开始生成值

如何做到这一点?

【问题讨论】:

  • 行中有datetimestamp 列吗?
  • @ClodoaldoNeto:是的,确实如此!

标签: postgresql


【解决方案1】:

您可以为此使用sequence。无需模仿。

CREATE SEQUENCE my_serial START 1;

然后通过

选择值
SELECT nextval('my_serial');

那么半夜你alter the sequence

ALTER SEQUENCE my_serial RESTART WITH 1;

重置可以是 cron 作业或类似作业。

【讨论】:

    【解决方案2】:

    您正在寻找一个 SERIAL 列。

    类似的东西。

    CREATE TABLE MY_TABLE (
    id SERIAL,
    MY_COLUMN varchar);
    
    INSERT INTO MY_TABLE (MY_COLUMN) values ('ROW1');
    INSERT INTO MY_TABLE (MY_COLUMN) values ('ROW2');
    
    SELECT * FROM MY_TABLE;
    
    1,ROW1
    2,ROW2
    

    datatypes SERIAL

    要每天将 SERIAL 列重置为 1,您需要运行 (cron ?!?) 类似的作业

    SELECT SETVAL((SELECT pg_get_serial_sequence('MY_TABLE', 'id')), 1, false);
    

    如果您使用的是 SERIAL 字段,PostgreSQL 实际上会为您创建一个 SEQUENCE,每次插入一行时它都会递增。为了重置它,您需要知道序列名称是什么。通常是这样的

    [table_name]_[serial_field_name]_seq

    您可以通过运行 pg_get_serial_sequence('[table_name]', '[serial_field_name]') 找到序列名称。

    【讨论】:

    • 每天重置为 1 怎么样? SERIAL 只是 SEQUENCE 的快捷方式,它并不能真正响应我的需求,因为我必须每天从 1 开始。
    • @AlexSC 看看我更新的答案。也就是说,我让一个人看了你的问题,序列列可能不是理想的解决方案。 e4c5 答案可能更适合您... :)
    • serial 正在使用(并创建)一个序列。唯一的区别是,使用serial,当删除使用它的列时,序列也会被删除。
    • 运动你推荐我的答案
    • @e4c5 每个人都以更好的问题答案获胜。 :)
    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2011-01-10
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多