【问题标题】:How to set up value for serial type in PostgreSQL? [duplicate]如何在 PostgreSQL 中设置序列类型的值? [复制]
【发布时间】:2018-04-11 04:28:51
【问题描述】:

我的表中有一个主键,如下所示:

CREATE TABLE a (
    id serial NOT NULL,
    valuea citext NOT NULL,
    CONSTRAINT a_pkey PRIMARY KEY (id),
);

表格有以下几行:

id value
198  b
199  j

我无意中做了这个插入

Insert Into a(id,valuea) values (200,'hello');

现在,当我尝试以正确的方式进行另一次插入时:

Insert Into a(valuea) values ('b');

我希望它插入 (201,b),但由于上次手动插入,串行计数器不知道 200 已被使用。

我明白了:

错误:重复键值违反唯一约束 "a_pkey" 详细信息:密钥 (id)=(200) 已存在。

我理解这个错误。基本上它发生是因为我最后一次插入没有使用串行,因此它的计数器没有上升。

不知道怎么解决?

如何告诉串行计数器从 201 开始?

【问题讨论】:

  • 不要手动维护您的自动增量列。你没有 Postgres 聪明。

标签: sql postgresql


【解决方案1】:

当您创建 serial 键时,Postgres 会创建一个序列,用于生成下一个值。

只需找到该序列并将其 START 值修改为例如 201 。

SELECT setval(<name of the sequence>, 201, true);

【讨论】:

    【解决方案2】:

    您需要找到序列名称,通常类似于 <your table>_id_seq 并执行以下操作:

    ALTER SEQUENCE a_id_seq INCREMENT BY 1;
    

    【讨论】:

    • 我知道.. 但这是序列不是实际定义的序列。我该如何解决?除了列名之外,它没有其他名称。
    • @avi: a serial 在后台创建序列
    • 一个连续剧在幕后创建一个序列。您可以通过以下方式列出您的序列:SELECT c.relname FROM pg_class c WHERE c.relkind = 'S'
    • @avi 当您创建序列列时,序列定义为:CREATE SEQUENCE tablename_colname_seq; 所以 Remi 给了您实际的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2013-08-10
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多