Insertar clave primaria de incremento automático a la tabla existente

157

Estoy tratando de alterar una tabla que no tiene una clave principal ni una columna de autoincremento. Sé cómo agregar una columna de clave principal, pero me preguntaba si es posible insertar datos en la columna de clave principal automáticamente (ya tengo 500 filas en la base de datos y quiero darles la identificación, pero no quiero hacerlo manualmente) . ¿Alguna idea? Muchas gracias.

Gato volador
fuente
2
Puede hacer fácilmente alter tablepara agregar la clave, pero MySQL no generará ID para los campos que aún no los tienen. Tendrá que actualizar manualmente los campos existentes y luego asegurarse de que su nuevo auto_increment comience en el desplazamiento correcto: el valor predeterminado es '1' y de todos modos terminará con errores de clave duplicados.
Marc B
3
@MarcB Acabo de probar, y de hecho insertó los identificadores para las filas existentes a partir de 1
Michael Berkowski

Respuestas:

253

Una ALTER TABLEdeclaración que agrega la PRIMARY KEYcolumna funciona correctamente en mis pruebas:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

En una tabla temporal creada para fines de prueba, la instrucción anterior creó la AUTO_INCREMENT idcolumna e insertó valores de incremento automático para cada fila existente en la tabla, comenzando con 1.

Michael Berkowski
fuente
1
Sí, esta ha sido mi experiencia. Nunca recuerde haber tenido que ejecutar un script separado para completar los ID de auto_increment ...
Mike Purcell
1
jaja ... gracias. culpa mía. La marca verde es para usted, ya que la suya es más fácil de implementar. : D
FlyingCat
53
Para convertirla en la primera columna, use, FIRSTpor ejemplo,ALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
David Thomas
1
La mecánica de @Nikkie SQLite es bastante diferente. Encontrarás sugerencias aquí stackoverflow.com/questions/946011/sqlite-add-primary-key
Michael Berkowski
1
@WijaySharma Si creó la fila con incremento automático y debe recuperarla por id inmediatamente, MySQL ofrece LAST_INSERT_ID()ese valor SELECT * FROM table_name WHERE id = LAST_INSERT_ID()y la mayoría de las API de lenguaje de programación ofrecen alguna función / método para devolver ese valor en el código de la aplicación.
Michael Berkowski
51

supongamos que no tiene una columna para el incremento automático como id, no, entonces puede agregar usando la siguiente consulta:

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

Si tiene una columna, modifique el incremento automático mediante la siguiente consulta:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY
php
fuente
1
¿Qué hace el FIRSTal final?
Demencia
1
Hará que la nueva idcolumna sea la primera en la tabla en lugar de la última, que es el comportamiento predeterminado.
fmalina
Trabajando bien! ¡Gracias!
Majedur Rahaman
4

sí, algo como esto lo haría, aunque quizás no sea lo mejor, quizás 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++;
}

any_fieldtenga en cuenta que el que seleccione debe ser el mismo al actualizar.

Grigor
fuente
4

Para aquellos como yo obteniendo un Multiple primary key definederror, intente:

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

En MySQL v5.5.31, esto estableció la idcolumna como la clave principal para mí y completó cada fila con un valor incremental.

reflexiv
fuente
2

Lo más fácil y rápido que encuentro es esto

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

Pude adaptar estas instrucciones: tomar una tabla con una clave primaria sin incremento existente , agregar una clave primaria incremental a la tabla y crear una nueva clave primaria compuesta con las claves antiguas y nuevas como clave principal compuesta usando lo 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 primaria exactamente como cabría esperar. Con la "TABLA DE GOTAS" en la parte superior, puede ejecutar esto una y otra vez para experimentar con variaciones.

Lo que no he podido hacer funcionar es la situación en la que hay CLAVES EXTRANJERAS entrantes que ya apuntan al campo USER_ID. Recibo este mensaje cuando intento 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)

Supongo que necesito eliminar todas las claves foráneas antes de hacer la tabla ALTER y luego reconstruirlas después. Pero por ahora quería compartir esta solución con una versión más desafiante de la pregunta original en caso de que otros se encontraran con esta situación.

drchuck
fuente
0

Exporte su tabla, luego vacíela, luego agregue el campo como INT único, luego cámbielo a AUTO_INCREMENT, luego importe nuevamente su tabla que exportó anteriormente.

David C
fuente
0

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

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 
Nagesh Hugar
fuente
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
user1717828
0

Estaba enfrentando el mismo problema, así que lo que hice eliminé el campo para la clave principal, luego lo recreé y me aseguré de que sea incremental automático. Eso funcionó para mí. Espero que ayude a otros

Humphrey
fuente
0

ALTER TABLE tableName MODIFY tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT ;

Aquí tableName es el nombre de su tabla,

tableName es el nombre de su columna que es primaria tiene que modificarse

MEDIUMINT es un tipo de datos de su clave primaria existente

AUTO_INCREMENT tiene que agregar solo auto_increment después de que no sea nulo

Hará que esa clave primaria aumente automáticamente ......

Espero que esto sea útil :)

Hrushikesh vanga
fuente
1
Sería útil si edita y agrega alguna explicación.
Shashanth
-1

¿Cómo escribir PHP para ALTERAR el campo ya existente (nombre, en este ejemplo) para convertirlo en una clave primaria? W / o, por supuesto, agregando cualquier campo 'id' adicional a la tabla.

Esta es una tabla creada actualmente - Número de registros encontrados: 4 nombre VARCHAR (20) SÍ raza VARCHAR (30) SÍ color VARCHAR (20) SÍ peso SMALLINT (7) SÍ

Este es 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 lugar de obtener esto ...

Número de registros encontrados: 5 id int (11) NO PRI name VARCHAR (20) YES raza VARCHAR (30) YES color VARCHAR (20) YES peso SMALLINT (7) YES

después de intentarlo ..

$ query = "ALTERAR TABLA caballos de carreras AGREGAR ID INT NO NULO AUTO_INCREMENT PRIMERO, AGREGAR CLAVE PRIMARIA (id)";

¿Cómo conseguir esto? -

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

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

De Teague
fuente