2010-01-21 23 views
138

tengo el siguiente esquema de la tabla que mapea user_customers de permisos en una base de datos en vivo MySQL:sacar la llave primaria en MySQL

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 quitar las claves principales para user_customer_id y permission_id y retener la clave principal de carné de identidad.

Cuando funciono con el comando:

alter table user_customer_permission drop primary key; 

me sale 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 colocar la clave primaria de una columna?

Respuesta

219

Sin un índice, mantener una columna de autoincremento es demasiado caro, por eso MySQL requiere que una columna de autoincremento sea la parte más a la izquierda de un índice.

Debe eliminar la propiedad incrementado automáticamente antes de caer la llave:

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

en cuenta que tiene un compuesto PRIMARY KEY que cubre las tres columnas y id no se garantiza que sea único.

Si pasa a ser único, puede hacer que sea un PRIMARY KEY y AUTO_INCREMENT nuevo:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT; 
+0

¡Oh, sígueme! : P –

+0

¿No tendría que restaurar la columna id como clave principal auto_increment? alter table user_customer_permission add primary key (id); alter table user_customer_permission change id id int (11) auto_increment; – markb

+0

'@ markb': si restaura la clave principal, puede volver a convertirla en' AUTO_INCREMENT'. – Quassnoi

8
ALTER TABLE `user_customer_permission` MODIFY `id` INT; 
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY; 
11

creo Quassnoi ha respondido a su pregunta directa. Solo una nota al margen: tal vez esta sea 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 tienes aquí es una clave principal que es un compuesto de tres campos. Por lo tanto, no puede "soltar la clave principal en una columna". Puede soltar la clave principal o no soltar la clave principal. Si desea una clave principal que solo incluya una columna, puede soltar la clave principal existente en 3 columnas y crear una nueva clave principal en 1 columna.

+0

Gracias @Jay, muy útil – markb

92

una línea:

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

También no perderá el incremento automático y tienen que volver a añadir que lo que podría tener efectos secundarios.

+0

Perfecto. +1 para mantenerlo en una línea – markb

+4

Creo que esta respuesta debe flotar a la cima, ya que no solo elimina la necesidad de cambiar la definición del campo, sino que también permite modificar el cambio con restricciones fk en la tabla, realmente ayudó ¡Sacarme! – tomfumb

+0

@markb: considere marcar esto como la respuesta aceptada. – Kip

4

"si se restaura la clave principal, seguro que pueden acabar en manos de nuevo a AUTO_INCREMENT"

no debería haber ninguna cuestión de si es o no es deseable "restaurar la propiedad PK" y "restaurar la propiedad autoincrement "de la columna de ID.

Dado que FUE una autoincrementación en la definición anterior de la tabla, es bastante probable que exista algún programa que se inserte en esta tabla sin proporcionar un valor ID (porque la columna ID es de todos modos autoincremental).

El funcionamiento de dicho programa se interrumpirá al no restaurar la propiedad de autoincremento.

2

Primero modifique la columna para eliminar el campo auto_increment como este: alter table user_customer_permission modify column id int;

A continuación, suelte la tecla principal. alter table user_customer_permission drop clave principal;

4

en caso de tener clave primaria compuesta, hacerlo así- ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

0

primera copia de seguridad de la base de datos. A continuación, suelte cualquier clave externa asociada con la tabla. truncar la tabla de clave foránea. Interrumpir la tabla actual. Elimine las claves principales requeridas. Use sqlyog o workbench o heidisql o dbeaver o phpmyadmin.

1

Tuve el mismo problema y algunos valores dentro de mi mesa. A pesar de que he cambiado de clave principal con

ALTER TABLE user_customer_permission DROP PRIMARY KEY , ADD PRIMARY KEY ( Identificación )

problema continuó en mi servidor. Creé un nuevo campo dentro de la tabla. Transferí los valores al campo nuevo y eliminé el anterior. ¡Problema resuelto!

Cuestiones relacionadas