sql >> Base de Datos >  >> RDS >> Mysql

autoincremento cíclico para cada valor clave

MyISAM admite este comportamiento. Cree una clave principal de dos columnas y haga que la segunda auto-incremento de columna. Comenzará de nuevo para cada valor distinto en la primera columna.

CREATE TABLE t (i INT, j INT AUTO_INCREMENT, PRIMARY KEY (i,j)) ENGINE=MyISAM;
INSERT INTO t (i) VALUES (1), (1), (2), (2), (1), (3);
SELECT * FROM t; 

+---+---+
| i | j |
+---+---+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
+---+---+

Pero si lo piensa, esto solo es seguro para subprocesos en un motor de almacenamiento que hace bloqueo a nivel de tabla para sentencias INSERT. Porque INSERT tiene que buscar otras filas en la tabla para encontrar el máximo j valor por el mismo i valor. Si otras personas están haciendo INSERT al mismo tiempo, se crea una condición de carrera.

Por lo tanto, la dependencia de MyISAM, que bloquea a nivel de tabla en INSERT.

Consulte esta referencia en el manual:http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html en la sección Notas de MyISAM .

Hay muchas buenas razones para no usar MyISAM. El factor decisivo para mí es la tendencia de MyISAM a corromper los datos.

Re tu comentario:

InnoDB no admite el comportamiento de incremento por grupo descrito anteriormente. Puede crear una clave principal de varias columnas, pero el error que obtuvo se debe a que InnoDB requiere que la columna de incremento automático sea la primera columna en una clave de la tabla (no tiene que ser estrictamente la clave principal)

Independientemente de la posición de la columna de incremento automático en la clave de varias columnas, solo se incrementa cuando la usa con InnoDB; no numera las entradas por valor distinto en otra columna.

Para hacer esto con una tabla InnoDB, tendría que bloquear la tabla explícitamente durante la INSERCIÓN, para evitar condiciones de carrera. Haría su propia consulta SELECT para el valor máximo en el grupo en el que se está insertando. Luego inserte ese valor + 1.

Básicamente, debe omitir la función de incremento automático y especificar valores en lugar de generarlos automáticamente.