Saltar al contenido

¿Qué son las columnas de identidad?

Solución:

Esto es para implementar la característica que se encuentra en el estándar. (copiado de un borrador, fecha: 2011-12-21):

4.15.11 Columnas de identidad

Las columnas de una tabla base BT pueden incluir opcionalmente no más de una columna de identidad. El tipo declarado de una columna de identidad es un tipo numérico exacto con escala 0 (cero), INTEGER por ejemplo, o un tipo diferenciado cuyo tipo de fuente es un tipo numérico exacto con escala 0 (cero). Una columna de identidad tiene un valor inicial, un incremento, un valor máximo, un valor mínimo y una opción de ciclo.

… La definición de una columna de identidad puede especificar GENERATED ALWAYS o GENERATED BY DEFAULT.

Es un propiedad de una columna que básicamente dice que los valores para la columna serán proporcionados por el DBMS y no por el usuario y de alguna manera y restricciones específicas (aumentando, disminuyendo, teniendo valores máximo / mínimo, ciclando si se alcanza el valor máximo / mínimo).

Generadores de secuencia (normalmente llamadas simplemente “secuencias”) son una característica estándar de SQL relacionada: es un mecanismo que proporciona dichos valores y puede usarse para columnas de identidad.

Note la sutil diferencia: un SEQUENCE es un objeto que se puede utilizar para proporcionar valores para una o más columnas de identidad o incluso a voluntad.


Los distintos DBMS han implementado hasta ahora características similares en diferentes formas y sintaxis (MySQL: AUTO_INCREMENT, Servidor SQL: IDENTITY (seed, increment), PostgreSQL: serial utilizando SEQUENCE, Oracle: usando disparadores, etc.) y solo generadores de secuencia agregados recientemente (SQL Server en la versión 2012 y Oracle en 12c).

Hasta ahora, Postgres ha implementado generadores de secuencia (que se pueden usar para proporcionar valores para la columna, ya sea con las macros especiales serial y bigserial o con nextval() function) pero aún no ha implementado la sintaxis para columnas de identidad, como está en el estándar.

Definir columnas de identidad (y la ligera diferencia de serial columnas) y varias sintaxis (p. ej. GENERATED ALWAYS, NEXT VALUE FOR, etc.) del estándar SQL es de lo que trata esta característica. Es posible que también sea necesario realizar algunos cambios / mejoras en la implementación de secuencias, ya que las columnas de identidad utilizarán secuencias.

Si sigue las columnas de identidad del enlace (de la página que vio), encontrará:

columnas de identidad

De: Peter Eisentraut
Para: pgsql-hackers Asunto: columnas de identidad
Fecha: 2016-08-31 04:00:42
ID de mensaje: [email protected]


Aquí hay otro intento de implementar columnas de identidad. Esta es una variante conforme a los estándares de las columnas seriales de PostgreSQL. También corrige algunos problemas de usabilidad que tienen las columnas seriales:

  • necesita establecer permisos en la secuencia además de la tabla
  • CREATE TABLE LIKE /
  • copia por defecto pero se refiere a la misma secuencia ALTER TABLE
  • no se puede agregar / eliminar serialidad con
  • al soltar el valor predeterminado no se quita la secuencia

pequeñas rarezas porque la serie es una especie de macro especial
NEXT VALUE FOR

Todavía no se ha implementado realmente, porque quería hacer uso de la

cosas que había publicado anteriormente, pero tengo más trabajo que hacer allí.


Actualización 2017, septiembre:
Parece que la función estará en Postgres 10, que se lanzará en unos días / semanas: Novedades de Postgres 10: Columnas de identidad

Oracle también ha implementado columnas y secuencias de identidad, en la versión 12c. La sintaxis está de acuerdo con el estándar, por lo que verifiqué:

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

Columnas de identidad en Oracle Database 12c versión 1 (12.1)

La base de datos 12c introduce la capacidad de definir una cláusula de identidad frente a una columna de la tabla definida mediante un tipo numérico. La sintaxis se muestra a continuación.

Cómo se implementan realmente en PG 10

  • Puede ver cómo se implementan realmente ahora utilizando el resultado esperado del conjunto de pruebas. ALTER TABLEAlgunas claves para sacar de esto. START 7 INCREMENT BY 5

  • Puede especificar dónde comenzar y cuántos omitir con una cláusula sobre la creación de tablas o por OVERRIDING USER VALUE ,

    INSERT INTO t OVERRIDING USER VALUE VALUES (10, 'xyz');
    
    -- this isn't currently allowed.
    CREATE TABLE t ( a serial PRIMARY KEY, b text );
    INSERT INTO t (a,b) VALUES (1,'foo');
    INSERT INTO t (a,b) VALUES (1,'bar');
    
  • Insertar en una tabla con una columna de identidad ahora puede GENERATED ALWAYS para la columna de identidad que fuerza un reemplazo de la fila en conflicto: OVERRIDING SYSTEM VALUE Puede especificar INSERT para asegurar la generación, entonces solo necesita tener

    ERROR:  cannot insert into column "a"
    DETAIL:  Column "a" is an identity column defined as GENERATED ALWAYS.
    HINT:  Use OVERRIDING SYSTEM VALUE to override.
    
  • para ignorar eso o obtendrá un error cuando NOT NULL

  • una fila que especifica un valor para una columna de identidad.

  • Las columnas de identidad deben ser RESTART

Los permisos se propagan desde la tabla, no más secuencias subyacentes.

  • ALTER TABLE

    ALTER [ COLUMN ] column_name ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]
    ALTER [ COLUMN ] column_name DROP IDENTITY [ IF EXISTS ]
    ALTER [ COLUMN ] column_name { SET GENERATED { ALWAYS | BY DEFAULT } | SET sequence_option | RESTART [ [ WITH ] restart ] } [...]
    
  • CREATE TABLE

    GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]
    
  • CREATE SEQUENCE La identidad se puede restablecer por completo en un punto diferente con sequence_option Puede leer más sobre estos en los documentos de PostgreSQL 10 para

proporcionando el

mencionado anteriormente

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *