2012-04-06 18 views
5

Tengo un servidor MySQL 5 y una tabla en él con una autoincrementación en un campo de identificación (clave principal). Ahora quiero agregar un registro entre ellos, así que tengo que aumentar todos los demás identificadores en uno. Esto es lo que probé:Incremente el campo de identificación de autoincremento en uno

UPDATE myTable SET id=id+1 WHERE id >= 53 

Esto no funciona porque, por ejemplo, ya existe un registro con id = 52. ¿Cómo puedo hacer esto? Si él comenzara en la última entrada y hace las actualizaciones debería funcionar, creo. ¿Pero cómo?

+3

La primaria tiene por objeto proporcionar una identidad * * para una fila, no a la orden del * * ellos. Use una columna separada para especificar su orden deseada. Cambiar la clave principal de una fila después de insertarla solo le dará problemas. –

+1

¿Qué ocurre si se suelta y recrea el campo de autoincreament? –

+2

Dejar caer y volver a crear la columna (o intentar volver a numerar filas existentes) no funcionará, especialmente si ya ha utilizado los ID como una clave externa en otro lugar. (Romperá las conexiones con las filas existentes.) Debería escuchar a @MarkByers: "Cambiar la clave principal de una fila después de insertarla solo le dará problemas". También vea [esto] (http://stackoverflow.com/questions/2106237/is-herehere-any-harm-in-resetting-the-auto-increment) ASÍ LA pregunta y sus respuestas. –

Respuesta

11

no veo ninguna buena razón para ello. Solo problemas Antes de ejecutar la declaración siguiente, compruebe si tiene definidas las claves FOREIGN, que hacen referencia a este id. ¿Están configurados en ON UPDATE CASCADE? Además, ¿tiene algún activador relacionado con esta tabla?

Pero primero considere, por qué usted (piensa que) necesita esto. ¿Va a ser usado para ordenar la mesa? En ese caso, como señaló @Mark, debe usar una columna separada para especificar el orden que desee.


Sin embargo, si usted decide que realmente desea esto, el uso:

UPDATE myTable 
SET id = id + 1 
WHERE id >= 53 
ORDER BY id DESC ; 
+0

No lo uso para ordenar. ¿Hay alguna forma rápida de verificar las claves externas con MySQL Query Browser? Lo mismo para los desencadenantes ... – testing

+0

Para encontrar si hay FK ** de ** esta tabla en otras tablas, simplemente use 'SHOW CREATE TABLE myTable'. Para encontrar si hay FK ** a ** esta tabla de otros, deberá usar la base de datos 'information_schema'. –

+1

[consulta para buscar las claves externas] (http://stackoverflow.com/questions/7765820/query-to-find-foreign-keys) –

0

supongo que algo así funciona:

UPDATE myTable SET id=id+1 WHERE id >= (select id from myTable order by id DESC) 
+0

@Ken: a pesar de ser nombrado 'auto _...', puede asignar un valor si no desea el valor predeterminado auto_incrementado. –

+0

@ypercube: Yuk. Y gracias por la información :). Solo una razón más para no usar MySQL (para mí, de todos modos). Borrando mi comentario anterior. –

+0

AFAIK, lo mismo se aplica a las columnas Identity en SQL-Server. Pero el comportamiento habitual es, por supuesto, no ingresar valores manualmente. –

0

me había enfrentado mismo problema. Y también intenté con la consulta de OP y @Romain Hoog. Pero no tuvo éxito.

Finalmente se exportaron los datos de toda la tabla en excel y se hizo en Excel (no uno por uno, pero usando el truco que lo hace muy rápido).

Luego, se realizó una copia de seguridad de la tabla original y se recreó una nueva tabla con datos importados de Excel actualizado.

+0

¿Qué has hecho en Excel? Simplemente + 1 como fórmula? Pensé en exportar CSV y luego editar los datos aquí. Más tarde con 'LOAD DATA INFILE 'data.csv' REEMPLAZAR EN LA MESA myTable ...' Podría importar los datos. ¿Cómo lo tienes hecho? – testing

+0

hecho con arrastre + signo. He importado datos con la herramienta de IU no con los datos de carga. Pero puedes hacer esto también. –

+0

¿Qué herramienta de interfaz de usuario usaste? – testing

4

Rápido y sucio lo haces en 2 pasos.

  • aumento de la identificación por un número más alto que todos los demás
  • disminución todos los identificadores al número que desea utilizar

Al igual que

UPDATE myTable SET id=id+10000 WHERE id >= 53 
UPDATE myTable SET id=id-9999 WHERE id >= 53 
Cuestiones relacionadas