Название: INSERT не вставляет primary key Отправлено: Vlad от Ноябрь 03, 2009, 17:07 Есть Debian + QT 4.5 + PostgreSQL
Есть такая таблица: CREATE TABLE posts ( post_id serial NOT NULL, ip_addr character varying(255), post_name character varying(255), work_mode integer, status integer, CONSTRAINT posts_pkey PRIMARY KEY (post_id) ) добавляю значит данные в неё так: QSqlQuery query; query.prepare("INSERT INTO posts (ip_addr, post_name, work_mode, status)" "VALUES (?, ?, ?, 1);"); query.bindValue(0,ip_addr); query.bindValue(1,post_name); query.bindValue(2,work_mode); query.exec(); выводит ошибку QSqlError (-1, "QPSQL: Unable to create query". "ERROR: duplicate key value violates unique constraint "post-pkey") если делаю так: query.prepare("INSERT INTO posts (post_id, ip_addr, post_name, work_mode, status)" "VALUES (1, ?, ?, ?, 1);"); то вставка проходит. Почему не хочет автоматически вставляться primary key? Название: Re: INSERT не вставляет primary key Отправлено: lit-uriy от Ноябрь 03, 2009, 17:15 >>Почему не хочет автоматически вставляться primary key?
а собственно, какое значение Qt должна туда вставлять? Название: Re: INSERT не вставляет primary key Отправлено: igsavenko от Ноябрь 03, 2009, 17:53 При создании ты же сам указал, что не ноль:
post_id serial NOT NULL и первым способом ничего не записываешь туда, поэтому видимо и не может добавить. А вторым ты явно указал какой id будет, поэтому и добавляет. Сделай post_id автоинкрементом, если конечно id у тебя уникальны должны быть, тогда следующий id будет сам генерироваться. Думаю может помочь Название: Re: INSERT не вставляет primary key Отправлено: MoPDoBoPoT от Ноябрь 03, 2009, 17:54 lit-uriy, у него поле post_id типа SERIAL (это что-то вроде автоинкремента).
Vlad, тут дело не в Qt. Раз СУБД ругается на нарушение ограничения целостности, значит оно есть. Кстати, почему названия ОЦ разные? ...CONSTRAINT posts_pkey PRIMARY KEY (post_id)... ...duplicate key value violates unique constraint "post-pkey" Название: Re: INSERT не вставляет primary key Отправлено: igsavenko от Ноябрь 03, 2009, 17:57 у него поле post_id типа SERIAL (это что-то вроде автоинкремента). Значит моя версия решения проблемы не подходит. Извиняюсь! Название: Re: INSERT не вставляет primary key Отправлено: Vlad от Ноябрь 03, 2009, 18:51 Кстати, почему названия ОЦ разные? ...CONSTRAINT posts_pkey PRIMARY KEY (post_id)... ...duplicate key value violates unique constraint "post-pkey" опечатка просто, в ошибке тоже валит posts-pkey Название: Re: INSERT не вставляет primary key Отправлено: KADABRA от Ноябрь 03, 2009, 21:12 Почему не хочет автоматически вставляться primary key? Какая версия PostgreSQL? Как обрабатывается такой запрос?query.prepare("INSERT INTO posts (post_id, ip_addr, post_name, work_mode, status)" "VALUES (DEFAULT, ?, ?, ?, 1);"); P.S. Цитировать Есть такая таблица: Да, и вы уверены что таблица именно такая? Не был ли случайно удалён sequence posts_post_id_seq?Название: Re: INSERT не вставляет primary key Отправлено: MoPDoBoPoT от Ноябрь 03, 2009, 21:47 Есть ли данные в этой таблице? Если да, то какое текущее значение последовательности posts_post_id_seq и максимальное значение в поле post_id?
Название: Re: INSERT не вставляет primary key Отправлено: Vlad от Ноябрь 03, 2009, 23:39 Почему не хочет автоматически вставляться primary key? Какая версия PostgreSQL? Как обрабатывается такой запрос?query.prepare("INSERT INTO posts (post_id, ip_addr, post_name, work_mode, status)" "VALUES (DEFAULT, ?, ?, ?, 1);"); Версия PostgreSQL 8.4.0-2. Такой запрос матерится так же :) P.S. Цитировать Есть такая таблица: Да, и вы уверены что таблица именно такая? Не был ли случайно удалён sequence posts_post_id_seq?Да вроде на месте, гляжу колонку post_id в pgAdmin 3: Тип: Sequence Имя: posts_post_id_seq Ограничение: auto Тип: Function Имя: nextval('posts_post_id_seq'::regclass) Ограничение: auto Базу проектирую не я, если ошибка в базе, придется выяснять это с её разработчиком. Название: Re: INSERT не вставляет primary key Отправлено: Vlad от Ноябрь 03, 2009, 23:51 Есть ли данные в этой таблице? Если да, то какое текущее значение последовательности posts_post_id_seq и максимальное значение в поле post_id? Данные есть 39 записей, 37 забил для теста в pgAdmin version 1.11.0, 2 занес своей программой, предварительно добавив post_id в запрос руками. posts_post_id_seq по умолчанию стоит - nextval('posts_post_id_seq'::regclass). максимальное значение post_id - 39. Вообще, если это ошибка в базе, думаю надо мне с её разработчиком это выяснять, базу не я делаю Название: Re: INSERT не вставляет primary key Отправлено: Vlad от Ноябрь 04, 2009, 00:23 Хм. Э. Ппроблема как то странно решилась. После очередных плясок, вдруг стало заноситься как было написано в самом начале. В коде ничего такого не менял, чтобы могло повлиять на работу. В pgAdmin вроде тоже ничего не исправлял :-\
Название: Re: INSERT не вставляет primary key Отправлено: MoPDoBoPoT от Ноябрь 04, 2009, 16:07 Чуток почитав про PostgreSQL, а точнее про тип SERIAL, я смекнул в чем дело.
Такой код Код эквивалентен Код Ключевое слово DEFAULT. Оно означает, что в поле заносится следующее значение из последовательности, при передачи NULL. Ты сказал, что занес 2 записи с указанием конкретных значений поля (скорей всего продолжил последовательность), после чего сгенерированная последовательность "отстала" на 2. Затем, после 2-х неудачных попыток вставки с дефолтным значением, последовательность "догнала" максимальное значение автоинкрементного поля. Вот и получилось, что проблема разрешилась сама собой. Как-то так :) Название: Re: INSERT не вставляет primary key Отправлено: cya-st от Ноябрь 04, 2009, 17:57 Попробуй увеличить значение sequence posts_post_id_seq на 10. Тут проблема точно в sequence. У меня поначалу тоже такие ошибки лезли.
|