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.
- Genera un valor a menos que
GENERATED ALWAYS AS IDENTITY
- Ignora cualquier valor proporcionado por
INSERT
a menos que se especifiqueOVERRIDING SYSTEM VALUE
- Ignora cualquier valor proporcionado por
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: