Eliminar clave principal en MySQL

182

Tengo el siguiente esquema de tabla que asigna usuarios_usuarios a permisos en una base de datos MySQL en vivo:

mysql> describe user_customer_permission;
+------------------+---------+------+-----+---------+----------------+
| Field            | Type    | Null | Key | Default | Extra          |
+------------------+---------+------+-----+---------+----------------+
| id               | int(11) | NO   | PRI | NULL    | auto_increment |
| user_customer_id | int(11) | NO   | PRI | NULL    |                |
| permission_id    | int(11) | NO   | PRI | NULL    |                |
+------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

Me gustaría eliminar las claves primarias para user_customer_id y permission_id y conservar la clave primaria para id.

Cuando ejecuto el comando:

alter table user_customer_permission drop primary key;

Obtuve el siguiente error:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

¿Cómo puedo soltar la clave principal de una columna?

markb
fuente

Respuestas:

286

Sin un índice, mantener una columna de autoincremento se vuelve demasiado costoso, por eso MySQLrequiere que una columna de autoincremento sea la parte más a la izquierda de un índice.

Debe eliminar la propiedad de aumento automático antes de soltar la clave:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;

Tenga en cuenta que tiene un compuesto PRIMARY KEYque cubre las tres columnas y idno se garantiza que sea único.

Si resulta ser único, puede hacer que sea una PRIMARY KEYy AUTO_INCREMENTotra vez:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;
Quassnoi
fuente
¿No tendría que restaurar la columna de identificación como clave principal de auto_increment? alter table user_customer_permission agregar clave primaria (id); alter table user_customer_permission change id id int (11) auto_increment;
markb
@markb: si restaura la clave primaria, seguramente podrá volver a ella AUTO_INCREMENT.
Quassnoi
¿Qué significa que la columna de autoincremento sea una parte más a la izquierda de la CLAVE PRIMARIA? ?
Arup Rakshit
1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/... Para utilizar el AUTO_INCREMENTmecanismo con una tabla InnoDB, una AUTO_INCREMENTcolumna ai_coldebe definirse como parte de un índice tal que es posible llevar a cabo el equivalente de un indexado SELECT MAX(ai_col)de búsqueda en la tabla para obtener el valor máximo de columna. Por lo general, esto se logra haciendo que la columna sea la primera columna de algún índice de tabla.
Quassnoi
dice PRIMARIO no está definido. ¿Por qué ocurre esto? Así que tuve que eliminar y agregar nuevamente la columna ID sin especificar la clave principal
mrbengi
121

Una línea:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )

Tampoco perderá el incremento automático y tendrá que volver a agregarlo, lo que podría tener efectos secundarios.

mluebke
fuente
55
Creo que esta respuesta debe flotar hasta la cima, ya que no solo elimina la necesidad de cambiar la definición del campo, sino que también permite el cambio mediante la alteración de las restricciones de fk en la tabla, ¡realmente me ayudó!
Tomfumb
Perfecto ! Para mí, soltar la clave principal no funcionó, incluso si modifico el campo para eliminar el incremento automático. ¡Pero esta solución funciona bien!
user2447161
14

Creo que Quassnoi ha respondido tu pregunta directa. Solo una nota al margen: tal vez esta es solo una redacción incómoda de su parte, pero parece tener la impresión de que tiene tres claves principales, una en cada campo. Este no es el caso. Por definición, solo puede tener una clave principal. Lo que tiene aquí es una clave primaria que es un compuesto de tres campos. Por lo tanto, no puede "soltar la clave primaria en una columna". Puede soltar la clave principal o no soltar la clave principal. Si desea una clave primaria que solo incluya una columna, puede soltar la clave primaria existente en 3 columnas y crear una nueva clave primaria en 1 columna.

Arrendajo
fuente
11
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;
Alix Axel
fuente
7

En caso de que tenga una clave primaria compuesta, haga esto: ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

Visvendra Singh Rajpoot
fuente
5

"si restaura la clave primaria, seguramente puede volver a restaurarla a AUTO_INCREMENT"

No debe haber dudas sobre si es deseable "restaurar la propiedad PK" y "restaurar la propiedad de incremento automático" de la columna ID.

Dado que era un autoincremento en la definición previa de la tabla, es muy probable que exista algún programa que se inserte en esta tabla sin proporcionar un valor de ID (porque la columna ID es un autoincrement de todos modos).

La operación de cualquier programa de este tipo se interrumpirá al no restaurar la propiedad de aumento automático.

Erwin Smout
fuente
3

Primero modifique la columna para eliminar el campo auto_increment de esta manera: alter table user_customer_permission modify column id int;

Luego, suelte la clave principal. alter table user_customer_permission soltar clave primaria;

John Gunderman
fuente
2
ALTER TABLE `table_name` ADD PRIMARY KEY( `column_name`);
Malith Ileperuma
fuente
1

Tuve el mismo problema y al lado de algunos valores dentro de mi tabla. Aunque cambié mi clave primaria con

ALTER TABLEDROP PRIMARY KEY , ADD PRIMARY KEY (ID de permiso de usuario_cliente)

El problema continuó en mi servidor. ¡Creé un nuevo campo dentro de la tabla, transfirí los valores al nuevo campo y eliminé el viejo, problema resuelto!

Sam
fuente
1

Para agregar clave principal en la columna.

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

Para eliminar la clave primaria de la tabla.

ALTER TABLE table_name DROP PRIMARY KEY;
sumit katiyar
fuente
0

Primero haga una copia de seguridad de la base de datos. Luego suelte cualquier clave externa asociada con la tabla. truncar la tabla de clave externa. Truncar la tabla actual. Elimine las claves primarias requeridas. Utilice sqlyog o workbench o heidisql o dbeaver o phpmyadmin.

Noby Nirmal
fuente
0

Busque la tabla en el Administrador de SQL, haga clic con el botón derecho y seleccione diseño, luego haga clic con el botón derecho en el icono de la pequeña llave y seleccione eliminar la clave principal.

Ayudante novato
fuente
Si bien esta publicación puede resolver la pregunta, incluir una captura de pantalla realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer la misma interfaz de usuario que está viendo.
Pirate X