Estoy cambiando de MySQL a PostgreSQL y me preguntaba cómo puedo hacer valores de autoincremento. Vi en los documentos de PostgreSQL un tipo de datos "serial", pero recibo errores de sintaxis cuando lo uso (en v8.0).
579
Estoy cambiando de MySQL a PostgreSQL y me preguntaba cómo puedo hacer valores de autoincremento. Vi en los documentos de PostgreSQL un tipo de datos "serial", pero recibo errores de sintaxis cuando lo uso (en v8.0).
Respuestas:
Sí, SERIAL es la función equivalente.
SERIAL es solo una macro de tiempo de creación de tabla alrededor de secuencias. No puede modificar SERIAL en una columna existente.
fuente
"Table"
y"table"
luego la dejes sin comillas y la canonicetable
. La convención es simplemente nunca usar comillas en Pg. Puede, si lo desea, usar nombres de mayúsculas y minúsculas para la apariencia, simplemente no lo requiere:CREATE TABLE fooBar ( .. ); SELECT * FROM fooBar;
funcionará, como lo haráSELECT * FROM foobar
.Puede usar cualquier otro tipo de datos enteros , como
smallint
.Ejemplo:
Es mejor usar su propio tipo de datos, en lugar del tipo de datos en serie del usuario .
fuente
CREATE SEQUENCE
postgresql.org/docs/8.1/interactive/sql-createsequence.html ) . SIN EMBARGO, no estoy muy seguro de por qué cambiaste de dueño.Si desea agregar una secuencia al id en la tabla que ya existe, puede usar:
fuente
ALTER COLUMN user_id
?ERROR: syntax error at or near "DEFAULT"
Alguna sugerencia?Si bien parece que las secuencias son equivalentes al aumento automático de MySQL, hay algunas diferencias sutiles pero importantes:
1. Las consultas fallidas incrementan la secuencia / serie
La columna serial se incrementa en consultas fallidas. Esto conduce a la fragmentación de consultas fallidas, no solo a la eliminación de filas. Por ejemplo, ejecute las siguientes consultas en su base de datos PostgreSQL:
Debería obtener el siguiente resultado:
Observe cómo uid va de 1 a 3 en lugar de 1 a 2.
Esto todavía ocurre si tuviera que crear manualmente su propia secuencia con:
Si desea probar cómo es diferente MySQL, ejecute lo siguiente en una base de datos MySQL:
Debería obtener lo siguiente sin fragmentación :
2. La configuración manual del valor de la columna de serie puede provocar que las consultas futuras fallen.
Esto fue señalado por @trev en una respuesta anterior.
Para simular esto manualmente, configure el uid en 4, que "chocará" más tarde.
Datos de la tabla:
Ejecute otra inserción:
Datos de la tabla:
Ahora, si ejecuta otra inserción:
Fallará con el siguiente mensaje de error:
En contraste, MySQL manejará esto con gracia como se muestra a continuación:
Ahora inserte otra fila sin configurar uid
La consulta no falla, uid solo salta a 5:
Las pruebas se realizaron en MySQL 5.6.33, para Linux (x86_64) y PostgreSQL 9.4.9
fuente
Comenzando con Postgres 10, las columnas de identidad según lo definido por el estándar SQL también son compatibles:
crea una columna de identidad que no se puede anular a menos que se solicite explícitamente. La siguiente inserción fallará con una columna definida como
generated always
:Sin embargo, esto se puede anular:
Cuando se usa la opción,
generated by default
este es esencialmente el mismo comportamiento que laserial
implementación existente :Cuando se suministra un valor manualmente, la secuencia subyacente también debe ajustarse manualmente, lo mismo que con una
serial
columna.Una columna de identidad no es una clave principal de forma predeterminada (al igual que una
serial
columna). Si debe ser uno, una restricción de clave principal debe definirse manualmente.fuente
Lo sentimos, para repetir una pregunta anterior, pero esta fue la primera pregunta / respuesta de Stack Overflow que apareció en Google.
Esta publicación (que apareció primero en Google) habla sobre el uso de la sintaxis más actualizada para PostgreSQL 10: https://blog.2ndquadrant.com/postgresql-10-identity-columns/
que resulta ser:
Espero que ayude :)
fuente
GENERATED … AS IDENTITY
comandos son SQL estándar. Primero agregado en SQL: 2003 , luego aclarado en SQL: 2008 . Ver características # T174 y F386 y T178.Debe tener cuidado de no insertar directamente en su SERIE o campo de secuencia, de lo contrario su escritura fallará cuando la secuencia alcance el valor insertado:
fuente
En el contexto de la pregunta formulada y en respuesta al comentario de @ sereja1c, la creación
SERIAL
implícita crea secuencias, por lo que para el ejemplo anterior:CREATE TABLE
crearía implícitamente una secuenciafoo_id_seq
para la columna serialfoo.id
. Por lo tanto,SERIAL
[4 Bytes] es bueno por su facilidad de uso a menos que necesite un tipo de datos específico para su identificación.fuente
De esta manera funcionará seguro, espero que ayude:
Puede consultar los detalles en el siguiente enlace: http://www.postgresqltutorial.com/postgresql-serial/
fuente
Desde PostgreSQL 10
fuente