2012-07-04 23 views
5

¿Existe una posibilidad de incremento automático nativa y no alternativa para TODAS las tablas juntas en mySQL? Quiero decir, no solo auto inc por mesa, me refiero a UN número que cuenta para CADA fila nueva en la base de datos.¿Hay un incremento automático en la base de datos completa (no en cada tabla) en mySQL?

He visto esto en un oráculo profesional (?) Configurado. La principal ventaja es que tiene una identificación única para TODAS las filas/elementos en TODAS las tablas, no solo PER TABLE.

+2

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

+0

MySQL no tiene secuencias (como la mayoría de los otros DBMS). Necesitas rodar tu propia solución. –

+0

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

Respuesta

6

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.

+0

Para deshacerse de las múltiples filas en el primer enfoque, primero podemos eliminar todas las filas y luego hacer la inserción. – palindrom

Cuestiones relacionadas