Почему у оракула нет функции автоинкремента для первичных ключей?

Может кто-нибудь объяснить, почему этот оракул не поддерживает функцию автоинкремента для первичных ключей?

Я знаю, что одна и та же функция может быть достигнута с помощью последовательности и триггеров, но почему оракул не представил ключевое слово autoincrement, которое будет внутренне создавать последовательность и триггер. Бьюсь об заклад, парни в оракуле наверняка подумали бы об этом. Должна быть какая-то причина не давать эту функцию. Любые мысли?

Ответы

Ответ 1

Это может быть просто терминология. "AUTOINCREMENT" означает, что эта запись "103" будет создана между записями "102" и "104". В кластерных средах это не обязательно для последовательностей. Один node может вставить "100", "101", "102" , а другой node вставляет "110", "111", "112", поэтому записи "не в порядке". [Конечно, термин "последовательность" имеет одинаковую импликацию.]

Если вы решили не следовать модели последовательности, то вы вводите проблемы блокировки и сериализации. Вы вынуждаете вставку ждать фиксации/откат другой вставки, прежде чем определять, что такое следующее значение, или вы соглашаетесь с тем, что если транзакция откатывается, вы получаете пробелы в ключах.

Тогда возникает вопрос о том, что вы делаете, если кто-то хочет вставить строку в таблицу с определенным значением для этого поля (т.е. разрешено или работает как DEFAULT) или если кто-то пытается ее обновить. Если кто-то вставляет "101", автоинкремент "прыгает" на "102" или вы рискуете попытаться дублировать значения.

Это может иметь последствия для их утилит IMP и прямой записи пути и обратной совместимости.

Я не говорю, что это невозможно. Но я подозреваю, что в конце концов кто-то посмотрел на него и решил, что лучше провести время разработки в другом месте.


Изменить для добавления:

В Oracle 12.1 добавлена ​​поддержка столбца IDENTITY.

"В столбце идентификации будет назначаться возрастающее или уменьшающееся целочисленное значение из генератора последовательности для каждого последующего оператора INSERT. Вы можете использовать предложение identity_options для настройки генератора последовательности."

https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#CJAHJHJC

Ответ 2

Потому что он имеет последовательности, которые могут делать все автоинкремент, а затем некоторые.

Ответ 3

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

Я рекомендую просто поместить какой-то инкрементно-первичный ключ builder/function/tool в ваш инструментарий и иметь его для работы Oracle. И напишите своему конгрессмену и скажите ему, насколько они плохи, чтобы сделать эту функцию доступной из графического интерфейса пользователя или используя одну строку SQL!

Ответ 4

Многие жаловались на это, но в целом ответ заключается в том, что вы можете создать его достаточно легко с помощью последовательности и триггера.

Ответ 5

Последовательности могут легко выйти из синхронизации (кто-то вставляет запись вручную в базу данных без обновления последовательности). Oracle должен был реализовывать эту эпоху! Последовательности просты в использовании, но не так просто, как автоинкремент (требуется дополнительный бит кодирования).