【问题标题】:Postgres Sequence is generating negative values as primary keysPostgres 序列正在生成负值作为主键
【发布时间】:2018-05-10 22:54:06
【问题描述】:

我有一个表,它在插入记录时使用序列自动生成主键。但是,该序列正在生成负值。

我如何强制只生成正值,有没有办法随机生成 id(尤其是 varchar 类型)

questionnaries.sql #

CREATE TABLE public.questionnaries
(
  id integer NOT NULL DEFAULT nextval('questionnaries_id_seq'::regclass),
  personname character varying(255) NOT NULL,
  question character varying(255) NOT NULL,
  response character varying(255) NOT NULL,
  CONSTRAINT questionnaries_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.questionnaries
  OWNER TO postgres;

questionnaries_id_seq

CREATE SEQUENCE public.questionnaries_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 6
  CACHE 1;
ALTER TABLE public.questionnaries_id_seq
  OWNER TO postgres;

【问题讨论】:

  • ids需要随机吗?如果您像这样声明 id 列,生活会更轻松:id SERIAL PRIMARY KEY
  • @BShaps,如果可以选择创建字母数字随机主键
  • 字母数字方法有一些很老套的方法。如果只是一个数字随机主键是可以的,那么你可以使用pseudo_encrypt。如果您希望我在答案中显示字母数字方式,请告诉我。
  • @BShape,请告诉我 psuedo_encrypt 是如何工作的,还有知道为什么当前序列会生成负 id 吗?
  • 我最好的猜测是与您的整数值溢出有关。整数的最大值是 2,147,483,647,但您的序列会上升到远高于此的值。通常 Postgres 会为此引发错误,但可能对于与主键列配对的序列,它会执行类似于给出负数的操作。 pseudo_encrypt wiki

标签: database postgresql postgresql-9.5


【解决方案1】:

首先创建一个如下所示的序列。无论您想开始给出哪个数字,例如0 或 100。

CREATE SEQUENCE questionnaries_id_seq START 0;

你也可以查询

SELECT nextval('questionnaries_id_seq');

【讨论】:

  • 通过添加序列定义更新原帖。
  • 第一次调用时,在START 0 上调用nextval('questionnaries_id_seq') 会返回10 吗?
【解决方案2】:

序列在两种情况下产生负值,

1# 您已经创建了序列并在负数(“-1”)中指定了 INCREMENT BY 值。

2# 序列 INCREMENT BY 是正数且正确的形式,但是序列达到了它们的 MAX 值,这就是它开始生成序列的 MIN 值的原因。

有两种解决方案,

  1. 使用“NO MAXVALUE”和下面指定的序列的“NO CYCLE”参数。

    CREATE SEQUENCE <>
    NO MAXVALUE
    START WITH 0
    INCREMENT BY 1
    NO CYCLE;
    
  2. PostgreSQL 使用“SERIAL”生成数值。

    CREATE TABLE table_name (
         column_1 integer PRIMARY KEY DEFAULT nextval('serial'),
         column_2 varchar(40) NOT NULL
    );
    

【讨论】:

  • 序列创建在相似的行上。我已将序列定义添加到原始帖子中。该序列是自动生成的,因为我使用的是 SERIAL,但它仍然会生成负主键
  • 数据库表“questionnaries”中当前有多少条记录,表“questionnaries”中包含的ID最大值是多少。
  • 目前还不到 100,因为我正在开发概念证明。但是,预计它会在以后扩展
猜你喜欢
  • 2017-04-24
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2012-04-09
  • 1970-01-01
  • 2017-09-06
相关资源
最近更新 更多