2009-07-30 11 views
15

¿Alguien puede aclarar por qué el oráculo no admite una característica de autoincrement para las claves primarias?¿Por qué Oracle no tiene la característica de autoincrement para claves primarias?

Sé que la misma característica se puede lograr con la ayuda de la secuencia y desencadenadores, pero por qué Oracle no introdujo la palabra clave autoincrement que creará internamente una secuencia y un desencadenador. Apuesto a que los chicos en el oráculo definitivamente habrían pensado sobre esto. Debe haber alguna razón para no proporcionar esta función. ¿Alguna idea?

Respuesta

15

Puede ser solo una terminología. 'AUTOINCREMENT' implica que ese registro '103' se creará entre los registros '102' y '104'. En entornos agrupados, ese no es necesariamente el caso de las secuencias. Un nodo puede insertar '100', '101', '102' mientras que el otro nodo está insertando '110', '111', '112', por lo que los registros están 'fuera de servicio'. [Por supuesto, el término 'secuencia' tiene la misma implicación.]

Si decide no seguir el modelo de secuencia, introduce problemas de bloqueo y serialización. ¿Obliga a un inserto a esperar la confirmación/restitución de otro inserto antes de determinar cuál es el siguiente valor, o acepta que, si se retrotrae una transacción, obtiene espacios en las claves?

Luego está la cuestión de qué hacer si alguien quiere insertar una fila en la tabla con un valor específico para ese campo (es decir, está permitido, o funciona como PREDETERMINADO) o si alguien intenta actualizarlo . Si alguien inserta '101', ¿el autoincremento 'saltará' a '102' o correrá el riesgo de intentar valores duplicados?

Puede tener implicaciones para sus utilidades IMP y escrituras de ruta directa y compatibilidad hacia atrás.

No digo que no se haya podido hacer. Pero sospecho que al final alguien lo ha visto y ha decidido que puede pasar mejor el tiempo de desarrollo en otro lugar.


Editar para añadir:

En Oracle 12.1, se añadió soporte para una columna de identidad.

"A la columna de identidad se le asignará un valor entero creciente o decreciente de un generador de secuencias para cada instrucción INSERT subsiguiente. Puede usar la cláusula identity_options para configurar el generador de secuencias".

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

5

Porque tiene sequences, que puede hacer todo lo que hace autoincrement, y algo más.

+0

enlace roto en 17-06-2014 – guisantogui

+1

Actualizado - gracias por anotar. –

1

Muchos se han quejado de esto, pero la respuesta en general es que puedes crear uno fácilmente con una secuencia y un disparador.

5

Esto ha sido una manzana de la discordia durante bastante tiempo entre los diversos campos de DB. Para un sistema de base de datos tan pulido y bien construido como Oracle, todavía me sorprende que se requiera tanto código y esfuerzo para habilitar esta característica valiosa y de uso común.

Recomiendo simplemente poner algún tipo de constructor/función/herramienta de clave primaria incremental en su kit de herramientas y tenerlo a mano para el trabajo de Oracle. ¡Y escribe a tu congresista y cuéntale lo mal que necesitan para que esta característica esté disponible desde la GUI o usando una sola línea de SQL!

+0

En realidad, Oracle tiene el concepto de una SECUENCIA que es realmente lo que está buscando. –

+4

Sin embargo, además del autoincremento, debe agregar el aspecto de la tecla principal. Con MS-SQL puede hacer ambas cosas con una declaración (o un par de clics del mouse). Mi punto es que en MS-SQL es más fácil. – ajh1138

-1

secuencias pueden perder la sincronización con facilidad (alguien inserta manualmente un registro en la base de datos sin actualizar la secuencia).¡Oracle debería haber implementado esto hace siglos! Las secuencias son fáciles de usar, pero no tan fáciles como autoincrementar (requieren codificación adicional).

Cuestiones relacionadas