Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ID последней добавленной записи [D7, любая СУБД]


Страницы:   1 2 3 4 5

DVM ©   (2008-09-04 12:03:00) 

Вопрос тут уже вроде всплывал тут, но в основном касался каких то конкретных СУБД, например Access. Мне же нужен по возможности универсальный вариант, ну пусть хотя бы одинаково работающий в Access, MySQL, MSSQL, Oracle.

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

Как в таких случаях обычно поступают? Писать разный код для разных СУБД? Ввести свое доп. поле в которое пихать собственноручно сгенерированное чудо типа GUID и сразу после добавления находить запись по этому полю?


Ega23   (2008-09-04 13:18:00) [61]


> может конечно быть минимальным


1. Ты удивишься, но я тебе могу написать запрос для MSSQL, который будет вставлять значение в "дырку" для Identity-поля.
2. Ключ и не автоинкриментом может быть. Но при этом не перестаёт быть ключом.


Sergey13   (2008-09-04 13:09:00) [62]

> [13] DVM ©   (04.09.08 12:36)
> Не очень понял. Поясни.

Ну в принципе

> [16] Ega23 ©   (04.09.08 12:38)
> Ну что-то типа интербэйзного генератора

Есть таблица с двумя полями Table_name и Current_Id. Пишется функция, которая на входе получает имя таблицы а на выходе отдает текущее знгачение+1, меняя содержимое соответствующего поля. Все ключи заполняются через эту функцию. Опросив текущее значение получаешь искомое.
Но это не решение - это идея для решения. Потому что это надо очень задуматься о конкуренции на эту таблицу.


Игорь Шевченко   (2008-09-04 13:06:00) [63]


> Возможно, но это единственный  способ, который будет работать
> с любой БД.


ты бредишь


stas   (2008-09-04 13:05:00) [64]

>DVM ©   (04.09.08 12:25) [7]
Заключить в одну транзакцию.

>Ega23 ©   (04.09.08 12:32) [11]
может конечно быть минимальным

>Ega23 ©   (04.09.08 12:31) [10]
>Расстрелять из пулемёта за такое.
Возможно, но это единственный  способ, который будет работать с любой БД.


Ega23   (2008-09-04 13:00:00) [65]


> да, по сути - нужен модуль-посредник, который для каждой
> субд будет свой, а интерфейс к нему от основной функциональности
> - единый


Угу.


Правильный$Вася   (2008-09-04 12:58:00) [66]


> Ega23 ©   (04.09.08 12:51) [20]

да, по сути - нужен модуль-посредник, который для каждой субд будет свой, а интерфейс к нему от основной функциональности - единый


Ega23   (2008-09-04 12:51:00) [67]


> Все верно. ПО относительно несложное, но многопользовательское
> все же.


выноси общение с СУБД на уровень абстракции. Для каждой - реализация своя; то, что с этой абстракцией работает, про СУБД ничего не знает.
В конце-концов, ключевое поле на клиенте - вещь вообще абстрактнее некуда.


Правильный$Вася   (2008-09-04 12:45:00) [68]


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

не все субд поддерживают функции, да и способ их вызова различен


DVM   (2008-09-04 12:44:00) [69]


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

Все верно. ПО относительно несложное, но многопользовательское все же.


b z   (2008-09-04 12:41:00) [70]


> Хотя наверное конкуренция за эту таблицу получится сумашедшая
> в приличных размеров системе.
"Каждой твари по паре" :)


Ega23   (2008-09-04 12:38:00) [71]


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


Ну что-то типа интербэйзного генератора


Правильный$Вася   (2008-09-04 12:37:00) [72]


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

если это несложное по однопользовательское, то очень осторожно можно использовать MAX, хотя любое однопользовательское имеет тенденцию к переходу в многопользовательскую
но тогда появляется желание выжать больше из СУБД, но на абстракной СУБД больше выжать нельзя, появляется специфика, а тут уже никакой абстрактности, сплошная конкретика


Ega23   (2008-09-04 12:37:00) [73]


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


Там GUID-ы (точнее - аналог) совсем по-другой причине использовались: нужна была уникальная идентификация сущности не в рамках одного комплекса, а вообще, глобально.


DVM   (2008-09-04 12:36:00) [74]


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

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


Sergey13   (2008-09-04 12:32:00) [75]

Может быть сделать некую одинаковую функцию во всех СУБД, которая будет работать с таблицей, хранящей текущие идентификаторы всех талиц в БД? Хотя наверное конкуренция за эту таблицу получится сумашедшая в приличных размеров системе.


Ega23   (2008-09-04 12:32:00) [76]


> Кстати, он может быть и не Max, нотаки быть уникальным.
>  Об этом не думал?


Ega23   (2008-09-04 12:31:00) [77]


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


Расстрелять из пулемёта за такое.
Кстати, он может быть и не Max, то таки быть уникальным. Об этом не думал?


DVM   (2008-09-04 12:31:00) [78]


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

Тогда ID собственно станет не нужен, использоваться будет это дополнительное поле в качестве ключевого.


b z   (2008-09-04 12:28:00) [79]


> Ввести свое доп. поле в которое пихать собственноручно сгенерированное
> чудо типа GUID и сразу после добавления находить запись
> по этому полю?
А ... зачем при этом "автоинкрементное поле счетчик" ?


DVM   (2008-09-04 12:25:00) [80]


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


> select max(ID) from mytable
>

А если между моей вставкой и последующим выполнение этого запроса другой клиент добавит еще запись? Я получу не свой ID.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо