2012-01-30 16 views
128

Estoy tratando de modificar una tabla que no tiene clave principal ni columna auto_increment. Sé cómo agregar una columna de clave principal, pero me preguntaba si es posible insertar datos en la columna de la clave principal automáticamente (ya tengo 500 filas en DB y quiero darles el id pero no quiero hacerlo manualmente) . ¿Alguna idea? Muchas gracias.Insertar incremento automático de la clave principal en la tabla existente

+2

Puede hacer fácilmente el 'alter table' para agregar la clave, pero MySQL no generará identificadores para los campos que aún no los tienen. Tendrás que actualizar manualmente los campos existentes y luego asegurarte de que tu nuevo auto_increment comience con el desplazamiento correcto: de forma predeterminada es '1' y terminarías con errores de clave duplicados de todos modos. –

+2

@MarcB Acabo de probar, y de hecho insertó los identificadores para filas existentes comenzando en 1 –

Respuesta

206

Un ALTER TABLE declaración añadiendo la columna PRIMARY KEY funciona correctamente en mis pruebas:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT; 

En una tabla temporal creada para propósitos de prueba, la declaración anterior creados los valores de incremento automático AUTO_INCREMENTid columna y insertados para cada existente fila de la tabla, comenzando con 1.

+1

Sí, esta ha sido mi experiencia. Nunca recuerde tener que ejecutar un script separado para rellenar los identificadores de auto_increment ... –

+1

lol..Gracias. mi error. La marca verde es para usted, ya que la suya es más fácil de implementar en ese momento. : D – FlyingCat

+0

+1, funciona en 5.1.51-ndb-7.1.9a-log, en la tabla con el motor MyISAM –

3

sí, algo como esto lo haría, podría no ser la mejor, sin embargo, es posible que quieras hacer una copia de seguridad

$get_query = mysql_query("SELECT `any_field` FROM `your_table`"); 

$auto_increment_id = 1; 

while($row = mysql_fetch_assoc($get_query)) 
{ 
    $update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'"); 
    $auto_increment_id++; 
} 

observe que el any_field que seleccione debe ser el mismo al actualizar.

+0

bueno. Gracias. – FlyingCat

2

Para aquellos que como yo conseguir una oportunidad Multiple primary key defined error:

ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL; 

En MySQL v5.5.31 este conjunto de la columna de la id como la clave principal para mí y poblada cada fila con un valor incremental.

34

supongamos que usted no tiene la columna de incremento automático como ID, que no, entonces puede agregar utilizando la consulta siguiente:

ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST 

Si la columna hemos, a continuación, modificar a incremento automático usando siguiente consulta:

ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY 
+1

¿Qué hace el 'FIRST' al final? – Dementic

+1

Hará que la nueva columna 'id' sea la primera en la tabla en lugar de la última, que es el comportamiento predeterminado. –

3

El más fácil y rápida que encuentro es este

ALTER TABLE mydb.mytable 
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated, 
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC); 
2

yo era capaz de adaptar estos complementos tructions toma una tabla con una existente clave primaria no incrementada, y agrega una clave primaria incremental a la tabla y crea una nueva clave primaria compuesta con las claves antigua y nueva como clave primaria compuesta usando el siguiente código:

DROP TABLE IF EXISTS SAKAI_USER_ID_MAP; 

CREATE TABLE SAKAI_USER_ID_MAP (
     USER_ID    VARCHAR (99) NOT NULL, 
     EID     VARCHAR (255) NOT NULL, 
     PRIMARY KEY (USER_ID) 
); 

INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin'); 
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster'); 

ALTER TABLE SAKAI_USER_ID_MAP 
    DROP PRIMARY KEY, 
    ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST, 
    ADD PRIMARY KEY (_USER_ID, USER_ID); 

Cuando se hace esto, el campo _USER_ID existe y tiene todos los valores numéricos para la clave principal exactamente como era de esperar. Con la "DROP TABLE" en la parte superior, puede ejecutar esto una y otra vez para experimentar con las variaciones.

Lo que no he podido conseguir trabajando es la situación en la que hay LLAVES FOREIGNAS entrantes que ya apuntan al campo USER_ID. Recibo este mensaje cuando trato de hacer un ejemplo más complejo con una clave externa entrante de otra tabla.

#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150) 

que supongo que tengo que derribar todas las claves externas antes de hacer la tabla ALTER y luego reconstruirlos después. Pero por el momento quería compartir esta solución con una versión más desafiante de la pregunta original en caso de que otros se toparan con esta situación.

1

Exporte su tabla, luego vacíe su tabla, luego agregue el campo como único INT, luego cámbielo a AUTO_INCREMENT, luego importe su tabla nuevamente que haya exportado previamente.

-1

Cómo escribir PHP para ALTERAR el campo ya existente (nombre, en este ejemplo) para convertirlo en una clave principal? W/O, por supuesto, la adición de cualquier 'id' adicional campos a la tabla ..

Esto creó una mesa Actualmente - Número de registros encontrados: 4 Nombre VARCHAR (20) SÍ raza VARCHAR (30) SÍ de color VARCHAR (20) SÍ peso SMALLINT (7) SÍ

Esta un resultado final buscado (descripción de la tabla) -

Número de registros encontrados: 4 nombre VARCHAR (20) NO PRI raza VARCHAR (30) SÍ color VARCHAR (20) SÍ peso SMALLINT (7) SÍ

En vez de conseguir esto -

Número de registros encontrados: 5 Identificación del int (11) NO PRI nombre VARCHAR (20) SÍ raza VARCHAR (30) SÍ de color VARCHAR (20) SÍ peso SMALLINT (7) SI

después de probar ..

$ consulta = "ALTER TABLE ADD caballos de carreras Identificación del INT NO NULL AUTO_INCREMENT PRIMERA, agregar la clave principal (id)";

cómo conseguir esto? -

Número de registros encontrados: 4 nombre VARCHAR (20) NO PRI raza VARCHAR (30) SÍ de color VARCHAR (20) SÍ peso SMALLINT (7) SÍ

es decir INSERT/ADD .. etc. la clave principal INTO el primer registro de campo (sin agregar un campo 'id' adicional, como se indicó anteriormente.

0

Puede agregar una nueva columna clave principal a una tabla existente, que puede tener números de secuencia, usando comando:

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 
0

Estaba enfrentando el mismo problema, así que lo que hice caí en el campo de la clave principal, luego lo recreé y me aseguré de que sea autoincremental. Eso funcionó para mí. Espero que ayude a los demás

Cuestiones relacionadas