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


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

Author: Carrie Kendall, 2012-01-31

11 answers

Una instrucción ALTER TABLE agregando la columna PRIMARY KEY funciona correctamente en mi prueba:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

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

 217
Author: Michael Berkowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-16 02:42:01

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 tienes columna, entonces altera a incremento automático usando la siguiente consulta:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY
 40
Author: php,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-01 11:08:21

Para aquellos como yo que reciben un error Multiple primary key defined intente:

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

En MySQL v5.5.31 esto establece la columna id como la clave principal para mí y rellena cada fila con un valor incremental.

 4
Author: reflexiv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-25 16:08:25

Sí, algo como esto lo haría, aunque podría no ser el mejor, es posible que desee 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.

 3
Author: Grigor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-30 21:10:30

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);
 3
Author: Dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-29 08:43:36

Pude adaptar estas instrucciones tomar una tabla con una clave primaria existente no incremental, y agregar una clave primaria incremental a la tabla y crear una nueva clave primaria compuesta con las claves antigua y nueva como una 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 esto se hace, el campo _USER_ID existe y tiene todos los valores numéricos para la clave primaria exactamente como usted esperaría. Con la "TABLA DE CAÍDA" en la parte superior, puede ejecutar esto una y otra vez a experimenta con variaciones.

Lo que no he podido hacer funcionar es la situación en la que hay claves FORÁNEAS 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 derribar 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.

 2
Author: drchuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-29 14:10:38

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

 1
Author: David C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-10 04:41:33

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

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 
 0
Author: Nagesh Hugar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-23 11:53:12

Me enfrentaba al mismo problema, así que lo que hice fue dejar caer el campo para la clave primaria, luego lo recreé y me aseguré de que sea auto incremental . Eso funcionó para mí . Espero que ayude a otros

 0
Author: Humphrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-14 07:25:48

ALTER TABLE tableName MODIFICAR tableNameID MEDIUMINT not NULL AUTO_INCREMENT;

Aquí tableName es el nombre de tu tabla,

TableName es el nombre de su columna que es primaria tiene que ser modificado

MEDIUMINT es un tipo de datos de su clave primaria

AUTO_INCREMENT tienes que añadir solo auto_increment después de not null

Hará que la clave primaria aumento automático......

Espero que esto sea útil:)

 0
Author: Hrushikesh vanga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-10 19:01:14

¿Cómo escribir PHP para ALTERAR el campo ya existente (nombre, en este ejemplo) para convertirlo en una clave primaria? Sin, por supuesto, agregar 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 pequeño (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 pequeño (7) SÍ

En lugar de obtener esto -

Número de registros encontrados: 5 id int (11) NO PRI nombre VARCHAR(20) SÍ raza VARCHAR (30) SÍ color VARCHAR (20) SÍ peso pequeño (7) SÍ

Después de intentarlo..

Query query = " ALTER TABLE racehorses ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id)";

¿Cómo obtener 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, INSÉRTESE / ADD.. sucesivamente. la clave principal EN el primer registro de campo (sin agregar un campo 'id' adicional, como se indicó anteriormente.

 -1
Author: De Teague,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-18 18:10:30