2010-03-16 11 views
5

Quiero saber si puedo repoblar el valor de autoincrement en mysql.cómo repoblar/recrear la autoincrementación en mysql

Porque, tengo registros que parecen similares:

ID Name 
1 POP 
3 OLO 
12 lku 

Básicamente, quiero una manera de actualizar el ID de este

ID Name 
1 POP 
2 OLO 
3 lku 

¿Hay alguna manera de hacer esto en MySQL?

Gracias.

Respuesta

3

No es una buena práctica tocar las teclas principales, es mejor dejar que su DB lo maneje solo. Puede haber problemas si, entre el UPDATE y el ALTER, se agrega otro registro. Debido a esto, debe LOCK la tabla, que puede colgar otras consultas y cargar pico en un servidor de producción ocupado.

LOCK TABLES table WRITE 
UPDATE table SET id=3 WHERE id=12; 
ALTER TABLE table AUTO_INCREMENT=4; 
UNLOCK TABLES 

O - durante miles de filas (sin dependencias clave externa):

CREATE TEMPORARY TABLE nameTemp(name varchar(128) not null) 
INSERT INTO name SELECT name FROM firstTable 
TRUNCATE firstTable 
INSERT INTO firstTable SELECT name FROM nameTemp 

El último método sólo funciona cuando usted no tiene las claves externas. Si lo haces, necesitarás una tabla de búsqueda.

CREATE TEMPORARY TABLE lookup(newId INTEGER AUTO_INCREMENT, oldId INTEGER, PRIMARY KEY newId(newId)); 
INSERT INTO lookup (oldId) SELECT id FROM firstTable 
[do temp table queries above] 

Ahora tiene una mesa lookup con el viejo a nuevos identificadores que se pueden utilizar para actualizar las dependencias de clave externa en sus otras tablas (en un servidor de prueba!)

+0

NO, tengo miles de registros que quiero volver a llenar, Esta información es solo muestra. – JPro

+0

Actualizado para miles de registros – Andy

0

el cambio de la clave principal es una muy mala idea, ya que pone en peligro su integridad referencial (¿qué ocurre si otra tabla utiliza la identificación sin tener una clave externa con el "cambio correcto"?).

Si realmente, realmente tiene que hacerlo y no se preocupan por los malos efectos secundarios:

  • Crear una segunda mesa con estructura idéntica
  • INSERT INTO new_table (id, [otros campos]) SELECCIONE NULL, [otros campos] FROM old_table;
  • DROP old_table;
  • RENAME new_table old_table;

Advertencia:
Esto dañará cada mesa que tiene las claves externas en esta tabla (pero si tuviera tal, entonces no estaría haciendo esto de todos modos).

0

Es posible que desee probar algo como ...

Create Temporary table MyBackup 
( ID as your autoincrement, 
    OldID as Int for backlinking/retention, 
    RestOfFields as their type) 

insert into MyBackup 
( OldID 
    RestOfFields) 
select 
    ID as OldID, 
    RestOfFields 
    from 
    YourOriginalTable 
    order by 
    ID (this is your original ID) 

entonces usted tendrá una nueva tabla con un incremento automático con nuevos identificadores asignados, sin embargo, tener una copia completa de su identificación inicial. Luego, puede hacer actualizaciones correlacionadas con otras tablas y establecer ID = ID donde ID = OldID. Al mantener su inserción por orden de la ID original, evitará que los números se reemplacen fuera de secuencia.Ejemplo: si la tabla se ordenarse como Antiguo ID = 3, nuevo ID = 1 Antiguo ID = 1, nuevo ID = 3 Antiguo ID = 12, nuevo ID = 2

Su edad 3 de se convertirá en 1 de, a continuación, del 1 se convertiría en 3 de, y de 12 a ser de 2

Antiguo ID = 1, nuevo ID = 1 Antiguo ID = 3, nuevo ID = 2 Antiguo ID = 12, nuevo ID = 3

su ganado de 3 'sobrescribe el número más alto, y el 12 no entrará en conflicto con los 3 ya que los tres ya fueron bajados a 2.

Cuestiones relacionadas