Russian Qt Forum

Qt => Базы данных => Тема начата: Jkc от Октябрь 25, 2006, 12:28



Название: Как получить ID строки при вставке данных (SQL)
Отправлено: 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 поел с автоинкриментом, подскажите как мне его получить не делая повторного запроса.


Название: Как получить ID строки при вставке данных (SQL)
Отправлено: burunduk от Октябрь 25, 2006, 12:36
я делаю так:

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

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


Название: Как получить ID строки при вставке данных (SQL)
Отправлено: Jkc от Октябрь 25, 2006, 12:48
что то не выходит, можешь написать как в моём случае?


Название: Как получить ID строки при вставке данных (SQL)
Отправлено: burunduk от Октябрь 25, 2006, 12:58
Это уже платформозависимый код. У меня postgreSQL.
Можно посмотреть документацию к своей СУБД как узнать последний номер в сиквенсе.


Название: Как получить ID строки при вставке данных (SQL)
Отправлено: BaltikS от Октябрь 25, 2006, 13:37
Цитата: "burunduk"
я делаю так:

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

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

Честно говоря не думаю что это оптимально.....это равносильно SELECT MAX(id) FROM MYTABLE..... Также не вижу ничего кроссплатформенного......того, что бы могло по разному выполнять запрос!


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


Название: Re: Как получить ID строки при вставке данных (SQL)
Отправлено: Maxz от Октябрь 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 должно быть примерно также.


Название: Как получить ID строки при вставке данных (SQL)
Отправлено: Jkc от Октябрь 25, 2006, 16:09
В моём случае это MySQL


Название: Как получить ID строки при вставке данных (SQL)
Отправлено: alexis от Октябрь 25, 2006, 19:48
QVariant QSqlQuery::lastInsertId () const