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

时间:2016-05-25 02:41:50

标签: postgresql auto-increment

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

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”列上添加一个最小值(这是好的)但在遇到现有值时会失败/错误,因为该值存在。

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

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

1 个答案:

答案 0 :(得分:1)

不要在插入句子上指定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并失败。