¿Cómo agregar una clave principal a una tabla MySQL?

103

Esto es lo que intenté pero falla:

alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;

¿Alguien tiene un consejo?

mysql_go
fuente
11
Cuando algo falla , siempre es una buena idea especificar qué significa falla : ¿recibe un mensaje de error? cúal ?
Pascal MARTIN
Supongo que el mensaje de error se ve así: varias claves primarias definidas
LMD

Respuestas:

226

Después de agregar la columna, siempre puede agregar la clave principal:

ALTER TABLE goods ADD PRIMARY KEY(id)

En cuanto a por qué su secuencia de comandos no funcionaba, debe especificar PRIMARY KEY, no solo la palabra PRIMARY:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;
El Scrum Meister
fuente
Para mí dice: esto definiría múltiples claves primarias. Estoy usando InnoDB. Tenga en cuenta que ya tengo 3 de ellos.
LMD
2
Definitivamente pondría FIRSTdespués AUTO_INCREMENT, lo que significa que idserá la primera columna de la tabla ya existente. De lo contrario, se colocará al final de la tabla como está escrito ahora, lo que puede ser un poco confuso cuando se hace de manera simpleSELECT * ...
StefanK
Cómo obtener un primer lugar en la nueva columna 'id'
TipVisor
17

Columna existente

Si desea agregar una restricción de clave principal a una columna existente, toda la sintaxis enumerada anteriormente fallará.

Para agregar una restricción de clave primaria a una columna existente, use el formulario:

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;
MER
fuente
1
mysql no reconoce MODIFY como declaración adecuada (al menos en XAMPP, InnoDB)
LMD
@LMD ¿En qué versión de mysql estás? (NOTA: Sé que funcionó en el momento en que publiqué esto y creo que era 5.6 ... pero no puedo recordarlo con seguridad)
MER
1
Si para usted, como para mí, no funciona, reemplace MODIFY con CHANGE y ¡funcionará!
csr-nontol
12

Si su mesa es bastante grande, mejor no use la declaración:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

porque hace una copia de todos los datos en una tabla temporal, modifique la tabla y luego la vuelva a copiar. Mejor hazlo manualmente. Cambie el nombre de su mesa:

rename table goods to goods_old;

cree una nueva tabla con la clave principal y todos los índices necesarios:

create table goods (
    id  int(10) unsigned not null AUTO_INCREMENT
    ... other columns ...
    primary key (id)
);

mueva todos los datos de la tabla anterior a una nueva, desactivando claves e índices para acelerar la copia:

- UTILICE ESTO PARA LAS TABLAS MyISAM :

SET UNIQUE_CHECKS=0;
    ALTER TABLE goods DISABLE KEYS;
        INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
    ALTER TABLE goods ENABLE KEYS;
SET UNIQUE_CHECKS=1;

O

- UTILICE ESTO PARA LAS TABLAS InnoDB :

SET AUTOCOMMIT = 0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
    INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT; SET AUTOCOMMIT = 1;

Se necesitan 2000 segundos para agregar PK a una tabla con ~ 200 millones de filas.

Denis Makarskiy
fuente
Me sorprendió cuánto tiempo tuve que buscar para encontrar esta respuesta. Gracias por estos útiles ejemplos.
Ryan
4

No estoy seguro de si esto le importa a alguien más, pero prefiero la tabla de identificación a la primera columna de la base de datos. La sintaxis para eso es:

ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

Lo cual es solo una ligera mejora con respecto a la primera respuesta. Si quisiera que estuviera en una posición diferente, entonces

ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;

HTH, pies

ftrotter
fuente
3

Utilice esta consulta,

alter table `table_name` add primary key(`column_name`);
RATAN KUMAR
fuente
2

Este código funciona en mi base de datos mysql:

ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);
Michał Myszor
fuente
1
ALTER TABLE GOODS MODIFY ID INT(10) NOT NULL PRIMARY KEY;
Vimit Patel
fuente
0

Prueba esto,

alter table goods add column `id` int(10) unsigned primary key auto_increment
phponwebsites
fuente
0

Para mí, ninguna de las sugerencias funcionó y me dio los errores de sintaxis, así que intenté usar phpmyadmin (versión 4.9.2), (10.4.10-MariaDB) y agregué una idcolumna con clave primaria de incremento automático. IdLa columna se agregó muy bien desde el primer elemento.

El resultado de la consulta fue:

ALTER TABLE table_nameAÑADIR idINT NOT NULL AUTO_INCREMENT PRIMERO, AÑADIR CLAVE PRIMARIA ( id);

av3000
fuente
-3

Eliminar comillas para que funcione correctamente ...

alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;
Raja Muthukutty
fuente