PostgreSQL se puede configurar así con CREATE SEQUENCE seq_name
y usando nextval(seq_name)
en cada inserción.
MySQL no tiene soporte nativo para esto, puede simular el comportamiento de una SECUENCIA de PostgreSQL creando una tabla con una sola columna y AUTO_INCREMENT
en esa columna.
Siempre inserte en esa tabla primero lea el LAST_INSERT_ID
de esa tabla para obtener la identificación que necesita para insertar en su mesa. Sería una transacción segura para que nunca se generen duplicados.
Otra forma de lograr esto es crear una tabla con una columna no AUTO_INCREMENT
y solo una fila con el valor máximo actual. Cada vez que necesite incrementar ejecute UPDATE seq_table SET seq_column = seq_colum+1;
una actualización de incremento es en sí misma atómica pero también necesita leer el valor posterior que hace dos declaraciones y no son atómicas juntas a menos que establezca una transacción a su alrededor y un aislamiento apropiado nivel. Este enfoque ahorra espacio pero también genera consultas de bloqueo.
Varios hilos tratando de INSERT
tendrán que esperar a que otros actualicen el seq_table
antes de poder actualizarlo ellos mismos y leer el nuevo valor.
También habría que envuelva el UPDATE
y la SELECT
en seq_table
en una transacción con una adecuada ISOLATION LEVEL
a evitar leer el valor que algún otro flujo incrementa después de que se incrementa.
Esto significa que INSERTS
se convierte en un problema de transacción, pero normalmente no lo son, así que no recomendaría el segundo enfoque.
Si desea garantizar la exclusividad, puede utilizar la función ['UUID_SHORT()'] de MySQL (http://dev.mysql.com/doc/en/miscellaneous-functions.html#function_uuid-short). – eggyal
MySQL no tiene secuencias (como la mayoría de los otros DBMS). Necesitas rodar tu propia solución. –
No sé de una manera nativa. Pero tal vez podría escribir un activador de inserción que busca todas las tablas para el índice más alto y devolver ese valor. Al menos en teoría, honestamente, no estoy seguro de si eso es posible en MySQL. – acme