Последовательность Postgres, генерирующая отрицательное значение - PullRequest
0 голосов
/ 11 мая 2018

У меня есть таблица, которая использует последовательность для автоматической генерации первичного ключа при вставке записи.Однако последовательность генерирует отрицательные значения.

Как сделать так, чтобы генерировались только положительные значения, и существует ли способ генерировать идентификаторы случайным образом (особенно тип 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 голосов
/ 11 мая 2018

Последовательность генерирует отрицательное значение в двух сценариях.

1 # вы создали последовательность и задаете значения INCREMENT BY в отрицательном ("- 1").

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
    );
    
0 голосов
/ 11 мая 2018

Сначала создайте последовательность, как показано ниже. С любым числом, которое вы хотите начать, укажите, например, 0 или 100.

CREATE SEQUENCE questionnaries_id_seq START 0;

вы также можете запросить

SELECT nextval ('questionnaries_id_seq');

...