Russian Qt Forum

Qt => Базы данных => Тема начата: saim от Май 03, 2015, 10:00



Название: Qt, SQLite, autoincrement
Отправлено: saim от Май 03, 2015, 10:00
Здравствуйте ! У меня возникла проблема, есть таблица базы данных с авто инкрементирующим полем , скрипт (файл с запросами,  через некий разделитель) лежит в папке , я достаю все нужные мне строки для выполнения запроса из файла парсю по разделителю , и сую это все в цикл на выполнение (см. код ниже):
Код:
// выполнение запросов полученый с файла
    QSqlQuery q("", db);
    for(int i = 0 ; i < listQuery.size (); i++)
    {
        q.exec (listQuery.at (i));
        qDebug() << "listQuery [ " << i << " ]" << q.exec(listQuery.at(i)) << "listValue= " <<listQuery.at(i) ;
    }

Скрипты для примера покажу создание таблицы и добавление в нее записей ..
Код:
// создание таблицы
 create table dic_SubTasks (id integer primary key autoincrement,name varchar(128), image BLOB, comment varchar(256), fk_task integer,
           CONSTRAINT con_1 FOREIGN KEY (fk_task) REFERENCES dic_Dictionarys(id) on update cascade on delete cascade )
Код:
//добавление  записей
insert into dic_SubTasks (name, image, comment, fk_task) values('SubTasks1' ,'' , 'comment1', 1)

insert into dic_SubTasks (name, image, comment, fk_task) values('SubTasks2' ,'' , 'comment2', 2)

insert into dic_SubTasks (name, image, comment, fk_task) values('SubTasks3' ,'' , 'comment3', 3)
Проблема  в том что если я пишу id integer primary key autoincrement - то в таблицы все записи про дублированы ... Почему ??
Если создавать так:
Код:
create table dic_Task_Network (id integer primary key, name varchar(256), image BLOB, comment varchar(256))
insert into dic_Task_Network values (1, 'Прогнозування' ,'' ,'')
insert into dic_Task_Network values (2, 'Асоціативна память','', '')
insert into dic_Task_Network values (3, 'Апроксимація', '', '')
insert into dic_Task_Network values (4, 'Розпізнавання, класифікація образів', '', '')
insert into dic_Task_Network values (5, 'Прийняття рішень управління', '', '')
insert into dic_Task_Network values (6, 'Кластерний аналіз', '','')
insert into dic_Task_Network values (7, 'Стискання відновлення даних', '','')
insert into dic_Task_Network values (8, 'Задача комівояжера', '','')
все норм !!

За ранее спасибо ! через некий разделитель) лежит в папке , я достаю все нужные мне строки для выполнения запроса из файла парсю по разделителю , и сую это все в цикл на выполнение (см. код ниже):
Код:
// выполнение запросов полученый с файла
    QSqlQuery q("", db);
    for(int i = 0 ; i < listQuery.size (); i++)
    {
        q.exec (listQuery.at (i));
        qDebug() << "listQuery [ " << i << " ]" << q.exec(listQuery.at(i)) << "listValue= " <<listQuery.at(i) ;
    }

Скрипты для примера покажу создание таблицы и добавление в нее записей ..
Код:
// создание таблицы
 create table dic_SubTasks (id integer primary key autoincrement,name varchar(128), image BLOB, comment varchar(256), fk_task integer,
           CONSTRAINT con_1 FOREIGN KEY (fk_task) REFERENCES dic_Dictionarys(id) on update cascade on delete cascade )
Код:
//добавление  записей
insert into dic_SubTasks (name, image, comment, fk_task) values('SubTasks1' ,'' , 'comment1', 1)

insert into dic_SubTasks (name, image, comment, fk_task) values('SubTasks2' ,'' , 'comment2', 2)

insert into dic_SubTasks (name, image, comment, fk_task) values('SubTasks3' ,'' , 'comment3', 3)
Проблема  в том что если я пишу id integer primary key autoincrement - то в таблицы все записи про дублированы ... Почему ??
Если создавать так:
Код:
create table dic_Task_Network (id integer primary key, name varchar(256), image BLOB, comment varchar(256))
insert into dic_Task_Network values (1, 'Прогнозування' ,'' ,'')
insert into dic_Task_Network values (2, 'Асоціативна память','', '')
insert into dic_Task_Network values (3, 'Апроксимація', '', '')
insert into dic_Task_Network values (4, 'Розпізнавання, класифікація образів', '', '')
insert into dic_Task_Network values (5, 'Прийняття рішень управління', '', '')
insert into dic_Task_Network values (6, 'Кластерний аналіз', '','')
insert into dic_Task_Network values (7, 'Стискання відновлення даних', '','')
insert into dic_Task_Network values (8, 'Задача комівояжера', '','')
все норм !!

Заранее спасибо !


Название: Re: Qt, SQLite, autoincrement
Отправлено: saim от Май 10, 2015, 11:05
Форумчане!! Ни у кого нету идей ??

С ув. Saim!


Название: Re: Qt, SQLite, autoincrement
Отправлено: PimenS от Май 10, 2015, 11:28
Цитировать
// выполнение запросов полученый с файла
    QSqlQuery q("", db);
    for(int i = 0 ; i < listQuery.size (); i++)
    {
        q.exec (listQuery.at (i));
        qDebug() << "listQuery [ " << i << " ]" << q.exec(listQuery.at(i)) << "listValue= " <<listQuery.at(i) ;
    }

зачем 2 раза делать q.exec (listQuery.at (i))?


Название: Re: Qt, SQLite, autoincrement
Отправлено: Bepec от Май 10, 2015, 14:07
Чего то тема пролетела мимо глаз моих.

Ну во 1, при автоинкременте нужно передавать QVariant().
Во 2, вроде нужны поставить Not Null и Unique в поле индекса.
И вот тогда у вас всё должно заработать.

to PimenS - это отладочный вывод, не зависящий от происходящих в цикле действий. Следовательно данные должны быть взяты первый раз для работы внутри цикла, второй раз для дебажного вывода.



Название: Re: Qt, SQLite, autoincrement
Отправлено: Old от Май 10, 2015, 14:24
to PimenS - это отладочный вывод, не зависящий от происходящих в цикле действий. Следовательно данные должны быть взяты первый раз для работы внутри цикла, второй раз для дебажного вывода.
Чего? :)
Какие данные? В цикле дважды выполняется запрос, и если это запрос на вставку записи, то будет вставляться по две записи за итерацию.


Название: Re: Qt, SQLite, autoincrement
Отправлено: PimenS от Май 10, 2015, 15:37
Чего то тема пролетела мимо глаз моих.

Ну во 1, при автоинкременте нужно передавать QVariant().
Во 2, вроде нужны поставить Not Null и Unique в поле индекса.
И вот тогда у вас всё должно заработать.

to PimenS - это отладочный вывод, не зависящий от происходящих в цикле действий. Следовательно данные должны быть взяты первый раз для работы внутри цикла, второй раз для дебажного вывода.


1. При автоинкременте, в это поле вообще ничего передавать не надо, оно автоматом заполняется.
2. Автоинкремент и должен обрабатывать UNIQUE, а NOT NULL выставляется автоматом по PRIMARY KEY. (Хотя на 100% для SQLite не уверен про UNIQUE)

Для Postgresql работает

Код:
CREATE TABLE exchange.test
(
  idrow BIGSERIAL PRIMARY KEY, -- Идентификатор строки
  relname varchar NOT NULL
 
);

INSERT INTO exchange.test(relname) VALUES ('1');
INSERT INTO exchange.test(relname) VALUES ('2');

INSERT INTO exchange.test(idrow, relname) VALUES (1, '3');

ОШИБКА:  повторяющееся значение ключа нарушает ограничение уникальности "test_pkey"
DETAIL:  Ключ "(idrow)=(1)" уже существует.
********** Ошибка **********


3. Old ответил за меня.



Название: Re: Qt, SQLite, autoincrement
Отправлено: saim от Май 10, 2015, 20:12
Всем огромное СПАСИБО!!! Это моя не внимательность, прошу прощение!* Тему можно закрыть ...



Название: Re: Qt, SQLite, autoincrement
Отправлено: Bepec от Май 10, 2015, 23:07
судил по первому слову. Был неправ. Тему закрывайте сами :)


Название: Re: Qt, SQLite, autoincrement [Решено !]
Отправлено: saim от Май 11, 2015, 10:35
Вопрос закрыт!)