Универсальная генерация целочисленых ID
Добавлено: 05 мар 2004, 20:20
Нужно написать код работающий с различными СУБД, кто посоветует универсальный способ генерации новых целочисленых ID в базе?
Дело в том, что если делают это несколько человек сразу, может произойти облом. В Oracle это не проблема - Select for update - и всё.chur писал(а):А чем не подходит увеличиние на единицу максимального значения ID?
Это понятно. Каждый решает это по-разному. Я имел в виду только сам принцип: MAX+1 или случайное число. К тому же, если допустимо только 4-байтное целое, то использование hash_value практически невозможно.DeeJayC писал(а):Дело в том, что если делают это несколько человек сразу, может произойти облом.
вечная проблема....Я имел в виду только сам принцип: MAX+1 или случайное число
В Oracle и подавляющем большинстве SQL-серверов это действительно не проблема, но не потому что там есть Select for update и прочие средства для блокировок, а потому, что там есть сиквенсы (в InterBase они называются генераторами). Все пользователи для формирования определенного ключа должны использовать определенный сиквенс. Отсутствие обломов ГАРАНТИРОВАНО на 100%. Именно это и рекомендуется!Дело в том, что если делают это несколько человек сразу, может произойти облом. В Oracle это не проблема - Select for update - и всё.
На счет исчерпания диапазона... Гхм, я Вас умоляю!..вечная проблема....
ессно макс+1
но если исчерпаешь диапазон значений то придётся медленным тупым перебором.....
Код: Выделить всё
HRESULT CoCreateGuid(
GUID *pguid //Receives a pointer to the GUID on return
);
Задача кажется на первый взгляд попросту нереальной. Уникальным, независящим от СУБД способом работы с данными является SQL. Однако, НИОДНА, даже самая новая спецификация ANSI на SQL не поддерживает сиквенсы, которые являются безусловно оптимальным решением данной задачи. Т.е. не имеет такой специфицированной функции как, например, COUNT, которая бы вычисляла значение ключа. В результате мы имеем в одних базах Create Sequence, в других Create Generator в третьих вообще нет такого понятия. Функции обеспечивающие доступ к следующему значению из сиквенса тоже называются по разному!Нужно написать код работающий с различными СУБД, кто посоветует универсальный способ генерации новых целочисленых ID в базе?