2016-05-25 5 views
1

Я существующий Postgres таблицу, например:Запрашиваемая 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

Не указывайте поле 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 снова и потерпеть неудачу.

+0

Для моего случая, что, если я не могу изменить существующий profile_id. Я могу добавить еще одно. Извините, если это не очень понятно с самого начала. Я уже редактирую свой вопрос. – SianiparD

+0

Какая строка дает вам ошибку? Эта вставка вы показываете сразу после создания таблицы? или намного позже? Как я объясню, вы можете использовать 'ALTER SEQUENCE', поэтому следующее число:'> max (current_id) ' –

+0

Вы также можете попробовать [CURVAL()] (http://dba.stackexchange.com/questions/3281/how-do -i-use-currval-in-postgresql-to-get-the-last-insert-id), чтобы узнать, что такое текущее значение seq. Но вы также должны удалить последовательное поле из вставки –

Смежные вопросы