要求 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
并失败。
我有一个现有的 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
并失败。