Russian Qt Forum
Ноябрь 24, 2024, 04:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: INSERT не вставляет primary key  (Прочитано 11232 раз)
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?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Ноябрь 03, 2009, 17:15 »

>>Почему не хочет автоматически вставляться primary key?
а собственно, какое значение Qt должна туда вставлять?
Записан

Юра.
igsavenko
Гость
« Ответ #2 : Ноябрь 03, 2009, 17:53 »

При создании ты же сам указал, что не ноль:
   post_id serial NOT NULL
и первым способом ничего не записываешь туда, поэтому видимо и не может добавить.
А вторым ты явно указал какой id будет, поэтому и добавляет.

Сделай post_id автоинкрементом, если конечно id у тебя уникальны должны быть, тогда следующий id будет сам генерироваться.
Думаю может помочь
Записан
MoPDoBoPoT
Гость
« Ответ #3 : Ноябрь 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"
Записан
igsavenko
Гость
« Ответ #4 : Ноябрь 03, 2009, 17:57 »

у него поле post_id типа SERIAL (это что-то вроде автоинкремента).


Значит моя версия решения проблемы не подходит. Извиняюсь!
Записан
Vlad
Гость
« Ответ #5 : Ноябрь 03, 2009, 18:51 »


Кстати, почему названия ОЦ разные?
...CONSTRAINT posts_pkey PRIMARY KEY (post_id)...
...duplicate key value violates unique constraint "post-pkey"


опечатка просто, в ошибке тоже валит posts-pkey
Записан
KADABRA
Гость
« Ответ #6 : Ноябрь 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?
« Последнее редактирование: Ноябрь 03, 2009, 21:15 от KADABRA » Записан
MoPDoBoPoT
Гость
« Ответ #7 : Ноябрь 03, 2009, 21:47 »

Есть ли данные в этой таблице? Если да, то какое текущее значение последовательности posts_post_id_seq и максимальное значение в поле post_id?
Записан
Vlad
Гость
« Ответ #8 : Ноябрь 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

Базу проектирую не я, если ошибка в базе, придется выяснять это с её разработчиком.
Записан
Vlad
Гость
« Ответ #9 : Ноябрь 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.

Вообще, если это ошибка в базе, думаю надо мне с её разработчиком это выяснять, базу не я делаю
Записан
Vlad
Гость
« Ответ #10 : Ноябрь 04, 2009, 00:23 »

Хм. Э. Ппроблема как то странно решилась. После очередных плясок, вдруг стало заноситься как было написано в самом начале. В коде ничего такого не менял, чтобы могло повлиять на работу. В pgAdmin вроде тоже ничего не исправлял  В замешательстве
Записан
MoPDoBoPoT
Гость
« Ответ #11 : Ноябрь 04, 2009, 16:07 »

Чуток почитав про PostgreSQL, а точнее про тип SERIAL, я смекнул в чем дело.
Такой код
Код
SQL
CREATE TABLE tablename (
   colname SERIAL
);
 
эквивалентен
Код
SQL
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
   colname integer DEFAULT NEXTVAL('tablename_colname_seq') NOT NULL
);
 
Ключевое слово DEFAULT. Оно означает, что в поле заносится следующее значение из последовательности, при передачи NULL. Ты сказал, что занес 2 записи с указанием конкретных значений поля (скорей всего продолжил последовательность), после чего сгенерированная последовательность "отстала" на 2. Затем, после 2-х неудачных попыток вставки с дефолтным значением, последовательность "догнала" максимальное значение автоинкрементного поля. Вот и получилось, что проблема разрешилась сама собой.
Как-то так Улыбающийся
Записан
cya-st
Гость
« Ответ #12 : Ноябрь 04, 2009, 17:57 »

Попробуй увеличить значение sequence posts_post_id_seq на 10. Тут проблема точно в sequence. У меня поначалу тоже такие ошибки лезли.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.094 секунд. Запросов: 23.