sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo crear el equivalente de una columna de identidad de SQL Server en Postgres

tl;dr

Ahora en Postgres 10, especifique GENERATED BY DEFAULT AS IDENTITY según el estándar SQL.

create table tower 
(
  npages integer, 
  ifnds integer, 
  ifnid integer, 
  name varchar(20), 
  towid integer GENERATED BY DEFAULT AS IDENTITY    -- per SQL standard
)

Columna de identidad

Postgres 10 ahora admite el concepto de columna de identidad y utiliza la sintaxis SQL estándar. Si bien no soy un experto en MS SQL Server, creo que este nuevo soporte estándar es equivalente.

GENERATED … AS IDENTITY

El GENERATED … AS IDENTITY comando utilizado durante CREATE TABLE crea una secuencia implícita. La creación, el nombramiento, los permisos y la eliminación de esa secuencia son transparentes para usted, a diferencia de SERIAL . Muy intuitivo ahora. Si otorga un permiso de uso a la tabla, obtienen permiso para la secuencia. Si suelta la tabla, la secuencia se quita automáticamente.

Dos sabores de la sintaxis estándar. La diferencia importa solo si pasa un valor en lugar de dejar que se genere un valor. Por lo general, las personas siempre confían en el valor generado, por lo que normalmente simplemente usaría la primera versión, GENERATED BY DEFAULT AS IDENTITY .

  • GENERATED BY DEFAULT AS IDENTITY
    • Genera un valor a menos que INSERT comando proporciona un valor.
  • GENERATED ALWAYS AS IDENTITY
    • Ignora cualquier valor proporcionado por INSERT a menos que se especifique OVERRIDING SYSTEM VALUE

Consulte CREATE TABLE página de documentación.

Lee esta interesante página de Peter Eisentraut. Explica algunos problemas extraños con SERIAL . No hay tales problemas con la nueva función de columna de identidad. Entonces no hay razón para usar SERIAL más, no hay desventajas, solo ventajas; SERIAL se sustituye por GENERATED … AS IDENTITY .

Tenga en cuenta que una columna de identidad no es necesariamente una clave principal y no se indexa automáticamente. Por lo tanto, aún debe especificar PRIMARY KEY explícitamente si esa es su intención (como suele ser el caso).

CREATE TABLE person_ (

    id_ 
        INTEGER 
        GENERATED BY DEFAULT AS IDENTITY   -- Replaces SERIAL. Implicitly creates a SEQUENCE, specified as DEFAULT.
        PRIMARY KEY                        -- Creates index. Specifies UNIQUE. Marks column for relationships.
        ,

    name_ 
        VARCHAR( 80 )

) ;

La intención es que los detalles de la implementación interna estén ocultos para usted. No es necesario que sepa el nombre de la secuencia que se genera bajo las sábanas. Por ejemplo, puede restablecer el contador a través de la columna sin conocer la secuencia subyacente.

ALTER TABLE person_ 
    ALTER COLUMN id_ 
    RESTART WITH 1000      -- Reset sequence implicitly, without a name.
;

Especificando la identidad implícitamente:

  • Columna de marcas NOT NULL
  • Crea una secuencia
    • El tipo de secuencia coincide con la columna (32 bits, 64 bits, etc.)
  • Ata la secuencia a la columna
    • Hereda permisos
    • Cascadas cayendo
    • Permanece ligado a la columna incluso si se le cambia el nombre
  • Especifica la secuencia como fuente de valores predeterminados para esa columna

La columna de identidad puede tomar las mismas opciones que CREATE SEQUENCE :

  • START WITH start
  • MINVALUE minvalue | NO MINVALUE
  • MAXVALUE maxvalue | NO MAXVALUE
  • INCREMENT [ BY ] increment
  • CYCLE | NO CYCLE
  • CACHE caché
  • OWNED BY NONE
    (la especificación de propiedad para la columna de identidad no tiene sentido para mí, ya que la propiedad se administra automáticamente)

Ejemplo tonto de opciones:

id_ INTEGER 
GENERATED BY DEFAULT AS IDENTITY ( 
    START WITH 200 
    MINVALUE 100 
    MAXVALUE 205 
    CYCLE 
    INCREMENT BY 3 
) PRIMARY KEY

Agregar 4 filas: