我有一个现有的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添加下一个不存在的值?
答案 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
并失败。