Oracle. Как не нужно генерировать первичный ключ

Идея поста возникал при прочтении Получение в программе значения первичного ключа после INSERT.

В Oracle младше 12 версии нет автоинкрементного поля. Стандратный способ генерации первичных ключей — последовательности. Но иногда разработчики генерируют первичный ключ таким способом:

Это приводит к проблемам при многопользовательской работе. Типичная ситуация — пользователи одновременно получают новое значение для ПК, а потом вставляют записи:

Пользователь1Пользователь2
select max(rid) + 1 from table
select max(rid) + 1 from table
insert
insert

В результате второй пользователь зависает из-за блокировки. Если же первый пользователь зафиксирует данные, то у второго сработает ограничение по первичному ключу:

Пользователь1Пользователь2
select max(rid) + 1 from table
select max(rid) + 1 from table
insert
insert
commit
ORA-00001: нарушено ограничение уникальности

Для генерации ПК следует использовать последовательности или специальные механизмы вроде GUID. Иначе будут возникать ошибки.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Oracle. Как не нужно генерировать первичный ключ: 3 комментария

  1. По ряду причин GUID в качестве PK — это зло. Например, база с GUID в качестве PK будет более пухлой и медленной. К тому же при использовании GUID нужно отказаться от кластерных индексов (или IOT в Oracle). Для Oracle сиквенс для генерации PK — единственно правильное решение.

    1. Есть одна спорная ситуация. Бывает что нужна переносимость данных из одной БД в другую. Данные в разных таблицах и связаны вторичными ключами. При использовании последовательностей, перенос данных усложняется, по сравнению с GUID. Также с GUID легко отследить какие записи на разных БД содержат одну и ту же сущность.

  2. Про использование GUID в репликации я знаю. Но эта идея мне тоже не нравится. Да GUID использовать удобно, но это единственный его плюс. Справить нужду под ближайшим кустом тоже удобно, но мы почему то идем в туалет.

    P.S. Т.к. речь об Oracle, то на последок замечу, что системы репликации Oracle Streams и Oracle Golden gate для репликации не используют GUID (могу ошибаться про Golden gate)… в Oracle работают идиоты, которые не знают про GUID?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *