MySQL Eliminar algunas claves foráneas

190

Tengo una tabla cuya clave principal se usa en varias otras tablas y tiene varias claves externas para otras tablas.

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

El problema es que cuando intento eliminar una de las columnas de clave externa (es decir, locationIDX) me da un error.

"ERROR 1025 (HY000): error al cambiar el nombre"

¿Cómo puedo colocar la columna en la tabla de asignación anterior sin obtener este error?

Dibujó
fuente

Respuestas:

447

Como se explica aquí , parece que la restricción de clave externa debe eliminarse por el nombre de la restricción y no por el nombre del índice. La sintaxis es:

alter table footable drop foreign key fooconstraint
pugmarx
fuente
35
Este fue mi problema. Me siento un poco tonto ahora. Si alguien más tiene este problema, puede encontrar los nombres de restricción de clave externa utilizando la función SHOW CREATE TABLE.
Dibujó
14
Consejo: use SHOW CREATE TABLE footable;para ver cuál es el nombre de la restricción. No es el nombre de la columna per-se. ¡Gracias por la respuesta!
Chris Baker
2
Puede usar esto para encontrar restricciones de clave externa: SELECCIONAR * DESDE information_schema.table_constraints WHERE restrictint_schema = '<your db name>' AND restrictint_type = 'FOREIGN KEY'
Gayan Dasanayake
21

Las claves externas están ahí para garantizar la integridad de los datos, por lo que no puede soltar una columna siempre que forme parte de una clave externa. Primero debe soltar la clave.

Creo que la siguiente consulta lo haría:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;
zombat
fuente
16

Como todos dijeron anteriormente, puede eliminar fácilmente un FK. Sin embargo, me di cuenta de que puede ser necesario soltar la CLAVE en algún momento. Si tiene algún mensaje de error para crear otro índice como el último, quiero decir con el mismo nombre, sería útil descartar todo lo relacionado con ese índice.

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above
Karla Danitza Duran Memijes
fuente
10

Verifique cuál es el nombre CONSTRAINT y el nombre de la LLAVE EXTRANJERA:

SHOW CREATE TABLE table_name;

Elimine tanto el nombre de RESTRICCIÓN como el nombre de CLAVE EXTRANJERA:

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

¡Espero que esto ayude!

norodin
fuente
4

Aquí hay una manera de eliminar la restricción de clave externa, funcionará. ALTERAR TABLA location. location_id GOTA LLAVE EXTRANJERA location_ibfk_1;

Rey de la roca Kirant
fuente
2

Oye, seguí alguna secuencia anterior y encontré alguna solución.

SHOW CREATE TABLE footable;

Obtendrá FK Restringir nombre como

ProjectsInfo_ibfk_1

Ahora necesita eliminar estas restricciones. por alter table commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

Luego suelte la columna de la tabla,

alter table ProjectsInfo drop column clientId;
Pratik Gaurav
fuente
1

Generalmente obtiene este error si sus tablas usan el motor InnoDB. En ese caso, tendría que soltar la clave foránea, y luego hacer la tabla alter y soltar la columna.

Pero la parte difícil es que no puede soltar la clave externa usando el nombre de la columna, sino que debe encontrar el nombre utilizado para indexarla. Para encontrar eso, emita la siguiente selección:

MOSTRAR CREAR TABLA región; Esto debería mostrar una fila, en la esquina superior izquierda, haga clic en la opción +, haga clic en el botón de texto completo y luego haga clic en Ir. Allí obtendrá el nombre del índice, algo como esto:

RESTRICCIÓN region_ibfk_1 LLAVE EXTRANJERA (country_id) REFERENCIAS country (id) EN ELIMINAR SIN ACCIÓN EN LA ACTUALIZACIÓN SIN ACCIÓN Ahora simplemente emita un:

alter table region drop clave externa region_ibfk_1;

o

más simplemente escriba: - alterar tabla TableName soltar clave foránea TableName_ibfk_1 ;

recuerde que lo único es agregar _ibfk_1 después de su nombre de tabla para hacer así: - TableName _ibfk_1

Abinash Hota
fuente
0

No puede descartar la columna de clave externa porque se hace referencia a ella desde la tabla assignmentStuff. Por lo tanto, primero debe eliminar la restricción de clave externa assignmentStuff.assignmentIDX.

Una pregunta similar ya se ha hecho aquí . Consulte también aquí para más información.

Ronald Wildenberg
fuente
1
Entonces, debido a que taskStuff hace referencia a la clave principal de la tarea, ¿no puedo descartar la columna locationID de la tarea? Esto parece un poco intuitivo.
Dibujó
Parece que he cambiado algunos nombres de columna, por lo que mi respuesta realmente no tiene sentido. Perdón por eso ...
Ronald Wildenberg
0

Prueba esto:

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E
Shailendra Mishra
fuente
0

paso 1: show create table vendor_locations;

paso 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

Funcionó para mí.

Jyothi M
fuente
0

primero necesita obtener el nombre de restricción real por esta consulta

SHOW CREATE TABLE TABLE_NAME

Esta consulta dará como resultado un nombre de restricción de la clave externa, ahora debajo de la consulta la descartará.

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

El último número en el nombre de restricción anterior depende de cuántas claves externas tiene en la tabla

Owais Akber
fuente