2010-04-15 12 views
17

Tengo una tabla MySQL simple y el índice primario (id) no está numerado uno por uno (1, 31, 35, 100, etc.). Quiero que se numeren como (1, 2, 3, 4). Por favor, dime cómo hacerlo. También me gustaría señalar que soy consciente de las posibles consecuencias de la operación, pero solo quiero ordenar la mesa.Cómo volver a numerar el índice primario

Respuesta

35

Estoy de acuerdo en que otros métodos funcionarán, pero solo estoy dando una idea diferente. Esto va a hacer sin ningún tipo de requisitos de creación de tabla temporal ::

SET @i=0; 
UPDATE table_name SET column_name=(@i:[email protected]+1); 
+1

No restablecerá el valor de auto_increment, por lo que si tu auto_increment fue 1344 y después de actualizar solo obtienes 100 id, la siguiente fila tendrá el id 1344, creando un agujero nuevamente. Es posible configurar auto_increment manualmente después de la actualización. – dbemerlin

+1

o Por supuesto, debe actualizar el incremento automático; Me perdí de especificar eso. ALTER TABLE TABLENAME auto_increment = ; –

+1

Yah, esto es genial, pero hay una cosa a tener en cuenta: id duplicado –

0

tiene que definir el incremento automático de la clave principal (si se trata de una clave principal)

Aquí hay un enlace:

sql autoincrement

+2

-1: Esto no responde la pregunta. Si elimina, por ejemplo, la fila con el valor 2 autoincrementado, entonces tiene un agujero en los identificadores. Eso es lo que quiere cambiar. – dbemerlin

+0

Pero no puede evitar todo al permitir la eliminación de sus registros. Por lo tanto, crear una nueva tabla te ayudará temporalmente –

2
CREATE TABLE newtable 
    LIKE oldtable 
    SELECT NULL, col1, col2, col3, etc FROM oldtable; 

Sin incluir la columna de clave primaria en la selección, pero todas las otras columnas.

Y la columna de la clave principal debe ser la primera en la tabla, o deberá configurar el NULL en la posición de la columna de la clave principal. Y la columna debe tener una configuración "NOT NULL". De lo contrario, se establecerá como nulo, y eso es algo sin sentido.

La razón por la que esto funciona es porque a MySQL le gusta ignorar las inserciones NULL en auto_increments, y en cambio crea un nuevo número para ella (siempre que null no sea un valor válido en esa columna).

2
  1. Elimina la columna "id".
  2. Crear una identificación con nombre de columna con incremento automático activado (y no permitir valores nulos), tendrá los nuevos valores que desee.
  3. Asigne esta nueva columna "id" como PK.

editado más tarde gracias a los comentarios.

+0

, solo puedes tener una columna de incremento automático a la vez, así que si quieres seguir esta receta, puedes hacer un atajo: 1. elimina la columna anterior. 2. hacer uno nuevo. –

+0

sí, me olvidé de eso. – Numenor

4

La solución más sencilla es:

  • Cambiar nombre de la tabla a tablename_temp
  • crear una nueva tabla con el nombre de edad y la misma estructura
  • INSERT INTO nombre de tabla (id, campo1, campo2, field3) SELECCIONE NULL, field1, field2, field3, ... DESDE tablename_temp;
  • DROP tablename_temp

Esto destruirá todos sus datos si está utilizando claves externas y le recomiendo encarecidamente que sale de los identificadores como son. Una base de datos no está desordenada porque las claves primarias no están en secuencia, una base de datos está desordenada si su integridad referencial (valores de id que apuntan a la fila incorrecta o inexistente en otras tablas) está rota.

13

darle una oportunidad para volver a numerar método de dalmp (DALMP Database Abstraction Layer for MySQL using PHP.)

$db->renumber('table','uid'); 

básicamente se hace esto:

SET @var_name = 0; 
UPDATE Tablename SET ID = (@var_name := @var_name +1); 
ALTER TABLE tablename AUTO_INCREMENT = 1 
+0

Fantástico @tareco, esto es perfecto para un problema diferente pero similar cuando quieres importar registros de un volcado sql en una tabla y encontrar valores clave primarios conflictivos. Ejecuté su comando sql en mi tabla de destino antes de la importación y funcionó perfectamente. – AdamJones

1

Usted don no lo quiero La clave principal no es un número. Es solo una secuencia única sin sentido.

Cuestiones relacionadas