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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получить ID строки при вставке данных (SQL)  (Прочитано 7901 раз)
Jkc
Гость
« : Октябрь 25, 2006, 12:28 »

При вставке данных  у меня в базе срабатывает автоинкримент и присваивается новый ID строке. Но мне нужно сразу получить этот ID для дальнейшего использования, желательно без нового запроса.
Код:

query.exec("INSERT INTO dt_or ( org,  sity,  address,  tel, id_org)"
"VALUES (  '"+query_fb.value(0).toString()+ "', '"+query_fb.value(1).toString()+ "', '"+query_fb.value(2).toString()+ "', '"+query_fb.value(3).toString()+"' , '')"  );

id_org поел с автоинкриментом, подскажите как мне его получить не делая повторного запроса.
Записан
burunduk
Гость
« Ответ #1 : Октябрь 25, 2006, 12:36 »

я делаю так:

QSqlQuery query = QSqlDatabase::database().exec(QString("selectcurrval('%1')").arg(seqname));

где seqname имя объекта SEQUENCE
Записан
Jkc
Гость
« Ответ #2 : Октябрь 25, 2006, 12:48 »

что то не выходит, можешь написать как в моём случае?
Записан
burunduk
Гость
« Ответ #3 : Октябрь 25, 2006, 12:58 »

Это уже платформозависимый код. У меня postgreSQL.
Можно посмотреть документацию к своей СУБД как узнать последний номер в сиквенсе.
Записан
BaltikS
Гость
« Ответ #4 : Октябрь 25, 2006, 13:37 »

Цитата: "burunduk"
я делаю так:

QSqlQuery query = QSqlDatabase::database().exec(QString("selectcurrval('%1')").arg(seqname));

где seqname имя объекта SEQUENCE

Честно говоря не думаю что это оптимально.....это равносильно SELECT MAX(id) FROM MYTABLE..... Также не вижу ничего кроссплатформенного......того, что бы могло по разному выполнять запрос!
Записан
Вудруф
Гость
« Ответ #5 : Октябрь 25, 2006, 13:57 »

1. Сначала выбирать из последовательности, затем полученное значение вставлять в таблицу. Это НЕ равносильно "select max(id)...", так как между вставкой и выборкой может произойти другая вставка. Равносильно это будет только в случае, если транзакция работает только с данными на момент её начала. В Oracle это по-умолчанию не так по причине неэффективности. Всключается через "set transaction read only;".
2. В случае Oracle имеется вариант "insert into <table_name> (...) values (...) returning ... into ..." Наверняка аналогичные варианты имеются и в других СУБД. Так что читай документацию.
Записан
Maxz
Гость
« Ответ #6 : Октябрь 25, 2006, 15:21 »

Цитата: "Jkc"
При вставке данных  у меня в базе срабатывает автоинкримент и присваивается новый ID строке. Но мне нужно сразу получить этот ID для дальнейшего использования, желательно без нового запроса.
id_org поел с автоинкриментом, подскажите как мне его получить не делая повторного запроса.

Я в оракле делал примерно так:
Код:
  FUNCTION FInsert() RETURN NUMBER IS
    nType NUMBER:=0;
BEGIN
    INSERT INTO table(field...)
      VALUES (values...)
      RETURNING field_seq INTO nType;
    RETURN nType;
END;

ну, и соответственно nType - значение из сиквенса. В postgreSQL должно быть примерно также.
Записан
Jkc
Гость
« Ответ #7 : Октябрь 25, 2006, 16:09 »

В моём случае это MySQL
Записан
alexis
Гость
« Ответ #8 : Октябрь 25, 2006, 19:48 »

QVariant QSqlQuery::lastInsertId () const
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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