Конференция "Базы" » ID последней добавленной записи [D7, любая СУБД]
 
  • DVM © (04.09.08 12:03) [0]
    Вопрос тут уже вроде всплывал тут, но в основном касался каких то конкретных СУБД, например Access. Мне же нужен по возможности универсальный вариант, ну пусть хотя бы одинаково работающий в Access, MySQL, MSSQL, Oracle.

    Посредством SQL запроса в таблицу добавляется некая запись. Одним из полей таблицы является автоинкрементное поле счетчик (ID).
    После добавления записи в таблицу мне нужно получить значение поля ID для этой добавленной записи.

    Как в таких случаях обычно поступают? Писать разный код для разных СУБД? Ввести свое доп. поле в которое пихать собственноручно сгенерированное чудо типа GUID и сразу после добавления находить запись по этому полю?
  • Правильный$Вася (04.09.08 12:07) [1]

    > Мне же нужен по возможности универсальный вариант

    слишком бессмысленно
    хотя иногда может помочь уникальная комбинация записываемых полей, еслиона есть, конечно
  • Ega23 © (04.09.08 12:12) [2]

    > Посредством SQL запроса в таблицу добавляется некая запись.
    >  Одним из полей таблицы является автоинкрементное поле счетчик
    > (ID).
    > После добавления записи в таблицу мне нужно получить значение
    > поля ID для этой добавленной записи.


    1. Сам тип автоинкримента может быть разным (int  и bigint, serial и bigserial и т.п.).
    2. Его (автоинкримента) может и не быть как такового в СУБД.
    3. И GUID СУБД тоже может не уметь генерить (например, Postgres в поставке по-умолчанию не умеет, т.к. есть несколько способов).

    Я бы в такой ситуации на клиенте какое-нибудь уникальное значение генерил.
  • DVM © (04.09.08 12:14) [3]

    > слишком бессмысленно

    Может и бессмысленно, но хотелось бы абстрагировать несложное ПО от конкретной СУБД. Или хотя бы свести к минимуму переделки под другую СУБД.


    > хотя иногда может помочь уникальная комбинация записываемых
    > полей, еслиона есть, конечно

    такая мысль была, но комбинации полей не уникальны.
  • DVM © (04.09.08 12:18) [4]

    > Ega23 ©   (04.09.08 12:12) [2]


    > 1. Сам тип автоинкримента может быть разным (int  и bigint,
    >  serial и bigserial и т.п.).

    Ну int или подобный есть везде вроде.


    > 2. Его (автоинкримента) может и не быть как такового в СУБД.

    Я не замахиваюсь на вообще все СУБД. В тех что я написал есть по крайней мере.


    > 3. И GUID СУБД тоже может не уметь генерить (например, Postgres
    > в поставке по-умолчанию не умеет, т.к. есть несколько способов).
    >

    Так сам генерить буду и в запрос буду пихать.


    > Я бы в такой ситуации на клиенте какое-нибудь уникальное
    > значение генерил.

    Да я помню ветку про GUID-ы. Пока рассматриваю как основной вариант. Хотя совпадения возможные совсем не радуют.
  • stas © (04.09.08 12:22) [5]
    DVM ©   (04.09.08 12:03)
    наверное такой:
    после вставки
    select max(ID) from mytable
  • Игорь Шевченко © (04.09.08 12:24) [6]

    > Писать разный код для разных СУБД?


    Да
  • DVM © (04.09.08 12:25) [7]

    > stas ©   (04.09.08 12:22) [5]


    > select max(ID) from mytable
    >

    А если между моей вставкой и последующим выполнение этого запроса другой клиент добавит еще запись? Я получу не свой ID.
  • b z (04.09.08 12:28) [8]

    > Ввести свое доп. поле в которое пихать собственноручно сгенерированное
    > чудо типа GUID и сразу после добавления находить запись
    > по этому полю?
    А ... зачем при этом "автоинкрементное поле счетчик" ?
  • DVM © (04.09.08 12:31) [9]

    > А ... зачем при этом "автоинкрементное поле счетчик" ?
    >

    Тогда ID собственно станет не нужен, использоваться будет это дополнительное поле в качестве ключевого.
  • Ega23 © (04.09.08 12:31) [10]

    > stas ©   (04.09.08 12:22) [5]
    >
    > DVM ©   (04.09.08 12:03)
    > наверное такой:
    > после вставки
    > select max(ID) from mytable


    Расстрелять из пулемёта за такое.
    Кстати, он может быть и не Max, то таки быть уникальным. Об этом не думал?
  • Ega23 © (04.09.08 12:32) [11]

    > Кстати, он может быть и не Max, но таки быть уникальным.
    >  Об этом не думал?
  • Sergey13 © (04.09.08 12:32) [12]
    Может быть сделать некую одинаковую функцию во всех СУБД, которая будет работать с таблицей, хранящей текущие идентификаторы всех талиц в БД? Хотя наверное конкуренция за эту таблицу получится сумашедшая в приличных размеров системе.
  • DVM © (04.09.08 12:36) [13]

    > Sergey13 ©   (04.09.08 12:32) [12]
    >
    > Может быть сделать некую одинаковую функцию во всех СУБД,
    >  которая будет работать с таблицей, хранящей текущие идентификаторы
    > всех талиц в БД?

    Не очень понял. Поясни.
  • Ega23 © (04.09.08 12:37) [14]

    > Да я помню ветку про GUID-ы. Пока рассматриваю как основной
    > вариант. Хотя совпадения возможные совсем не радуют.


    Там GUID-ы (точнее - аналог) совсем по-другой причине использовались: нужна была уникальная идентификация сущности не в рамках одного комплекса, а вообще, глобально.
  • Правильный$Вася (04.09.08 12:37) [15]

    >  хотелось бы абстрагировать несложное ПО от конкретной СУБД

    если это несложное по однопользовательское, то очень осторожно можно использовать MAX, хотя любое однопользовательское имеет тенденцию к переходу в многопользовательскую
    но тогда появляется желание выжать больше из СУБД, но на абстракной СУБД больше выжать нельзя, появляется специфика, а тут уже никакой абстрактности, сплошная конкретика
  • Ega23 © (04.09.08 12:38) [16]

    > Не очень понял. Поясни.


    Ну что-то типа интербэйзного генератора
  • b z (04.09.08 12:41) [17]

    > Хотя наверное конкуренция за эту таблицу получится сумашедшая
    > в приличных размеров системе.
    "Каждой твари по паре" :)
  • DVM © (04.09.08 12:44) [18]

    > Правильный$Вася   (04.09.08 12:37) [15]

    Все верно. ПО относительно несложное, но многопользовательское все же.
  • Правильный$Вася (04.09.08 12:45) [19]

    > Может быть сделать некую одинаковую функцию во всех СУБД

    не все субд поддерживают функции, да и способ их вызова различен
 
Конференция "Базы" » ID последней добавленной записи [D7, любая СУБД]
Есть новые Нет новых   [134477   +43][b:0][p:0]