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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получить ID строки при вставке данных (SQL)  (Прочитано 8226 раз)
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.02 секунд. Запросов: 17.