18 enero 2015

Oracle 12cR1 novedades (Parte II); Columnas Identidad



Oracle 12c Nueva característica – Columnas Identidad

Viendo las nuevas características de la versión 12c, encontré que ahora podemos definir una columna con el  tipo de dato Identity, tal como lo tiene desde hace tiempo IBM DB2, en concreto desde la versión 8.0, de la siguiente manera:

SQL>CREATE TABLE table (col1 INT,col2 DOUBLE,col3 INT NOT NULL GENERATED ALWAYS AS IDENTITY;
(START WITH 100, INCREMENT BY 5))

Que significa una columna Identity?
Es incorporar a una columna la propiedad de ser auto numérica.


COLUMN_NAME  GENERATED [ ALWAYS | BY DEFAULT [ ON NULL ] ]AS                                  
  IDENTITY  [ ( identity_options ) ]

Donde

  • ALWAYS      Indica que no será necesario introducir un valor para esta columna en una sentencia insert. Por el contrario indicar un valor aunque sea Null, da un error ORA-32795.
  • BY DEFAULT  Le permite utilizar Identity, si la columna no se hace  referencia en la una sentencia insert, pero si se hace referencia a la columna, el valor especificado se utiliza en lugar de la  identidad. El intento de especificar el valor NULL en este caso se traduce en un error, ya que las columnas de identidad son siempre NOT NULL. 
  • BY DEFAULT [ON NULL]: Si en una sentencia INSERT se mete un valor NULL, esta se generará un nuevo valor, si en cambio si mete un valor para esta columna, se insertará el valor de la sentencia.
Contras al implementar esta característica
  1. Dado a que una columna definida como IDENTITY está vinculada a una secuencia, le ocurre lo mismo que si la secuencia se define por fuera, por lo cual si una sentencia INSERT abortara, los números de la secuencia se perderían.
  2. En el caso de hacer una copia de seguridad de una tabla, se exportaría con todos sus valores, la querer importar esa tabla. 
  • Solución: Deberíamos tener en cuenta que la columna IDENTITY  este en by default porque en caso contrario daría error.
Conclusión 
La inclusión de las columnas IDENTITY, es un importante avance, ya que encapsula en una sentencia INSERT la obtención del nextval de la secuencia. Como ocurre con IBM DB2 o M$ SQL Server.

Por otro lado la inclusión de las opciones By Default y By Default On Null, permiten que los valores puedan ser internos o externos. Lo más importante es que esto lo hacemos casi sin que perdamos performance.

Mi opinion
Esta es una característica poco aseada que se ha introducido unos 20 años tarde. En mi opinión, que fácilmente podría haber sido implementado en Oracle 6.0. Podría ser útil para nuevas aplicaciones, aunque la cantidad de tiempo y esfuerzo ahorrado es insignificante. Para las aplicaciones existentes de la relevancia de esta nueva característica es más cuestionable;´Nadir va a mezclar estilos de codificación y modificar código funcional, por una característica que apenas aporta nada.