Postgres序列产生负值

时间:2018-05-10 22:54:07

标签: database postgresql postgresql-9.5

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

如何强制只生成正值,并且有办法随机生成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;

2 个答案:

答案 0 :(得分:2)

首先创建一个如下所示的序列。你想要开始的那个号码,例如0或100。

CREATE SEQUENCE questionnaries_id_seq START 0;

你也可以查询

SELECT nextval('questionnaries_id_seq');

答案 1 :(得分:1)

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

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. 使用“SERIAL”通过PostgreSQL生成数值。

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