要求 Postgres 添加一个不存在的序列值

Asking Postgres to add a non-existent sequence value

我有一个现有的 Postgres table,例如:

CREATE TABLE profiles(
  profile_id    SERIAL PRIMARY KEY,
  num_feed      integer, 
  num_email     integer, 
  name          text
);

ALTER TABLE ONLY profiles ALTER COLUMN profile_id SET DEFAULT nextval('profiles_profile_id_seq'::regclass);
ALTER TABLE ONLY profiles ADD CONSTRAINT profiles_pkey PRIMARY KEY (profile_id);
CREATE INDEX "pi.profile_id" ON profiles USING btree (profile_id);

而且这是现有的数据,我无法更改,只能添加新的。

INSERT INTO profiles VALUES
(3, 2, 5, 'Adam Smith'),
(26, 2, 1, 'Fran Morrow'),
(30, 2, 2, 'John Doe'),
(32, 4, 1, 'Jerry Maguire'),
(36, 1, 1, 'Donald Logue');

问题是当我尝试插入新数据时,Postgres 会在列 "profile_id" 上添加一个最小值(这很好),但是当它达到一个现有值时会 failed/error,因为该值存在。

ERROR:  duplicate key value violates unique constraint "profile_id"
DETAIL:  Key (profile_id)=(3) already exists.

是否可以要求 Postgres 添加下一个不存在的值?

不要在插入语句中指定 SERIAL 字段,让 postgres 从序列中为您生成它。

INSERT INTO profiles 
 (num_feed,  num_email, name)
VALUES
(2, 5, 'Adam Smith'),
(2, 1, 'Fran Morrow'),
(2, 2, 'John Doe'),
(4, 1, 'Jerry Maguire'),
(1, 1, 'Donald Logue');

注意:如果您在一段时间后重置序列,这可能会失败,例如

ALTER SEQUENCE 'profiles_profile_id_seq' RESTART WITH 1;

下一次插入将尝试再次创建 1 并失败。