【发布时间】: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