Sé que MySQL limita las columnas de autoincremento a las claves primarias. ¿Por qué es esto? Mi primer pensamiento es que es una restricción de rendimiento, ya que probablemente hay alguna tabla de contador en algún lugar que debe bloquearse para obtener este valor.
¿Por qué no puedo tener múltiples columnas auto_increment en la misma tabla?
Gracias.
mysql
primary-key
auto-increment
Christopher Armstrong
fuente
fuente
Respuestas:
¿Por qué querrías tener una columna auto_increment que no sea la clave principal?
Si desea que una columna sea un aumento automático, por definición, no está almacenando datos significativos en esa columna. El único caso en el que tiene sentido almacenar información no significativa es el caso especial en el que desea tener una clave primaria sintética. En ese caso, la falta de información es un beneficio porque no hay riesgo de que alguien aparezca en el futuro y quiera cambiar los datos porque algún atributo de alguna entidad cambió.
Tener varias columnas auto_increment en la misma tabla parece aún más extraño. Las dos columnas tendrían los mismos datos: después de todo, se generan con el mismo algoritmo y se rellenan al mismo tiempo. Supongo que podría llegar a una implementación en la que es posible que estén ligeramente fuera de sincronización si hubiera suficientes sesiones simultáneas. Pero no puedo imaginar cómo eso sería útil en una aplicación.
fuente
De hecho, el atributo AUTO_INCREMENT no está limitado a la PRIMARY KEY (más). Solía ser así en versiones anteriores, definitivamente 3.23 y probablemente 4.0. Aún así, el manual de MySQL para todas las versiones desde 4.1 se lee así
Por lo tanto, puede tener una columna AUTO_INCREMENT en una tabla que no es la clave principal. Si eso tiene sentido, es un tema diferente sin embargo.
También debo mencionar que una columna AUTO_INCREMENT siempre debe ser un tipo entero (técnicamente también se permite un tipo de punto flotante) y que debe estar SIN FIRMAR. Un tipo FIRMADO no solo desperdicia la mitad del espacio clave, sino que también puede ocasionar grandes problemas si se inserta un valor negativo por accidente.
Finalmente, MySQL 4.1 y posterior define un alias de tipo SERIAL para BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
fuente
Esta es una pregunta interesante porque diferentes bases de datos tienen enfoques únicos para proporcionar auto_increment.
MySQL : solo se genera una clave auto_increment para identificar de forma exclusiva una fila en una tabla. No hay mucha explicación detrás de por qué, sino solo implementación. Dependiendo del tipo de datos, los valores de aumento automático se fijan por la longitud del tipo de datos en bytes:
PostgreSQL
El tipo de datos interno serial se usa para el incremento automático de 1 a 2,147,483,647. Se permiten rangos más grandes usando bigserial.
Oráculo : el objeto de esquema llamado SECUENCIA puede crear nuevos números simplemente invocando la función nextval. PostgreSQL también tiene dicho mecanismo.
Aquí hay una buena URL que proporciona cómo otros DB los especifican: http://www.w3schools.com/sql/sql_autoincrement.asp
Ahora, con respecto a su pregunta, si realmente desea tener múltiples columnas de aumento automático en una sola tabla, tendrá que emular eso.
Dos razones por las que debes emular esto:
¿Cómo lo emularías?
Usar varias tablas que tienen solo una columna de aumento automático y asignarlas a las columnas deseadas en las tablas de destino. Aquí hay un ejemplo:
Copie y pegue este ejemplo:
Esto creará una tabla de cuestionarios pop para maestros. También creé cinco emuladores de secuencia, uno para cada día de la semana escolar. Cada emulador de secuencia funciona insertando el valor 0 en la columna val. Si el emulador de secuencia está vacío, comienza con val 0, nextval 1. Si no, la columna nextval se incrementa. Luego puede buscar la columna nextval del emulador de secuencia.
Aquí están los resultados de la muestra del ejemplo:
Si realmente necesita múltiples valores de incremento automático en MySQL, esta es la forma más cercana de emularlo.
Darle una oportunidad !!!
ACTUALIZACIÓN 2011-06-23 21:05
Acabo de notar en mi ejemplo que no uso el valor @pop.
Esta vez reemplacé 'pop_tue = pop_tue + 1' con 'pop_tue = @pop' y volví a intentar el ejemplo:
fuente
bigserial
tipo de datos que ofrece un rango que es mucho mayor que 2,147,483,647Como dice XL, no se limita solo a las claves principales. Es una limitación potencial que solo pueda tener una de esas columnas por tabla, pero la mejor solución es generar tantos números que necesite en otra tabla y luego insertarlos donde lo necesite.
fuente