-
Вопрос тут уже вроде всплывал тут, но в основном касался каких то конкретных СУБД, например Access. Мне же нужен по возможности универсальный вариант, ну пусть хотя бы одинаково работающий в Access, MySQL, MSSQL, Oracle.
Посредством SQL запроса в таблицу добавляется некая запись. Одним из полей таблицы является автоинкрементное поле счетчик (ID).
После добавления записи в таблицу мне нужно получить значение поля ID для этой добавленной записи.
Как в таких случаях обычно поступают? Писать разный код для разных СУБД? Ввести свое доп. поле в которое пихать собственноручно сгенерированное чудо типа GUID и сразу после добавления находить запись по этому полю?
-
> Мне же нужен по возможности универсальный вариант
слишком бессмысленно
хотя иногда может помочь уникальная комбинация записываемых полей, еслиона есть, конечно
-
> Посредством SQL запроса в таблицу добавляется некая запись.
> Одним из полей таблицы является автоинкрементное поле счетчик
> (ID).
> После добавления записи в таблицу мне нужно получить значение
> поля ID для этой добавленной записи.
1. Сам тип автоинкримента может быть разным (int и bigint, serial и bigserial и т.п.).
2. Его (автоинкримента) может и не быть как такового в СУБД.
3. И GUID СУБД тоже может не уметь генерить (например, Postgres в поставке по-умолчанию не умеет, т.к. есть несколько способов).
Я бы в такой ситуации на клиенте какое-нибудь уникальное значение генерил.
-
> слишком бессмысленно
Может и бессмысленно, но хотелось бы абстрагировать несложное ПО от конкретной СУБД. Или хотя бы свести к минимуму переделки под другую СУБД.
> хотя иногда может помочь уникальная комбинация записываемых
> полей, еслиона есть, конечно
такая мысль была, но комбинации полей не уникальны.
-
> Ega23 © (04.09.08 12:12) [2]
> 1. Сам тип автоинкримента может быть разным (int и bigint,
> serial и bigserial и т.п.).
Ну int или подобный есть везде вроде.
> 2. Его (автоинкримента) может и не быть как такового в СУБД.
Я не замахиваюсь на вообще все СУБД. В тех что я написал есть по крайней мере.
> 3. И GUID СУБД тоже может не уметь генерить (например, Postgres
> в поставке по-умолчанию не умеет, т.к. есть несколько способов).
>
Так сам генерить буду и в запрос буду пихать.
> Я бы в такой ситуации на клиенте какое-нибудь уникальное
> значение генерил.
Да я помню ветку про GUID-ы. Пока рассматриваю как основной вариант. Хотя совпадения возможные совсем не радуют.
-
DVM © (04.09.08 12:03)
наверное такой:
после вставки
select max(ID) from mytable
-
> Писать разный код для разных СУБД?
Да
-
> stas © (04.09.08 12:22) [5]
> select max(ID) from mytable
>
А если между моей вставкой и последующим выполнение этого запроса другой клиент добавит еще запись? Я получу не свой ID.
-
> Ввести свое доп. поле в которое пихать собственноручно сгенерированное
> чудо типа GUID и сразу после добавления находить запись
> по этому полю?
А ... зачем при этом "автоинкрементное поле счетчик" ?
-
> А ... зачем при этом "автоинкрементное поле счетчик" ?
>
Тогда ID собственно станет не нужен, использоваться будет это дополнительное поле в качестве ключевого.
-
> stas © (04.09.08 12:22) [5]
>
> DVM © (04.09.08 12:03)
> наверное такой:
> после вставки
> select max(ID) from mytable
Расстрелять из пулемёта за такое.
Кстати, он может быть и не Max, то таки быть уникальным. Об этом не думал?
-
> Кстати, он может быть и не Max, но таки быть уникальным.
> Об этом не думал?
-
Может быть сделать некую одинаковую функцию во всех СУБД, которая будет работать с таблицей, хранящей текущие идентификаторы всех талиц в БД? Хотя наверное конкуренция за эту таблицу получится сумашедшая в приличных размеров системе.
-
> Sergey13 © (04.09.08 12:32) [12]
>
> Может быть сделать некую одинаковую функцию во всех СУБД,
> которая будет работать с таблицей, хранящей текущие идентификаторы
> всех талиц в БД?
Не очень понял. Поясни.
-
> Да я помню ветку про GUID-ы. Пока рассматриваю как основной
> вариант. Хотя совпадения возможные совсем не радуют.
Там GUID-ы (точнее - аналог) совсем по-другой причине использовались: нужна была уникальная идентификация сущности не в рамках одного комплекса, а вообще, глобально.
-
> хотелось бы абстрагировать несложное ПО от конкретной СУБД
если это несложное по однопользовательское, то очень осторожно можно использовать MAX, хотя любое однопользовательское имеет тенденцию к переходу в многопользовательскую
но тогда появляется желание выжать больше из СУБД, но на абстракной СУБД больше выжать нельзя, появляется специфика, а тут уже никакой абстрактности, сплошная конкретика
-
> Не очень понял. Поясни.
Ну что-то типа интербэйзного генератора
-
> Хотя наверное конкуренция за эту таблицу получится сумашедшая
> в приличных размеров системе.
"Каждой твари по паре" :)
-
> Правильный$Вася (04.09.08 12:37) [15]
Все верно. ПО относительно несложное, но многопользовательское все же.
-
> Может быть сделать некую одинаковую функцию во всех СУБД
не все субд поддерживают функции, да и способ их вызова различен