Почему у оракула нет функции автоинкремента для первичных ключей?
Может кто-нибудь объяснить, почему этот оракул не поддерживает функцию автоинкремента для первичных ключей?
Я знаю, что одна и та же функция может быть достигнута с помощью последовательности и триггеров, но почему оракул не представил ключевое слово 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 должен был реализовывать эту эпоху!
Последовательности просты в использовании, но не так просто, как автоинкремент (требуется дополнительный бит кодирования).