MySQL Eliminar Algunas claves foráneas


Tengo una tabla cuya clave principal se usa en varias otras tablas y tiene varias claves foráneas 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 estoy tratando de soltar una de las columnas de clave foránea (es decir, locationIDX) me da un error.

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

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

Author: Sankar, 2009-05-08

9 answers

Como se explica aquí, parece que la restricción de clave foránea debe ser eliminada por nombre de restricción y no por el nombre del índice. La sintaxis es:

alter table footable drop foreign key fooconstraint
 382
Author: pugmarx,
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-11-07 13:03:41

Las claves foráneas están allí para garantizar la integridad de los datos, por lo que no puede soltar una columna mientras sea parte de una clave foránea. Tienes que soltar la llave primero.

Creo que la siguiente consulta lo haría:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;
 21
Author: zombat,
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-03-22 22:23:38

Como todos dijeron anteriormente, puede eliminar fácilmente un FK. Sin embargo, acabo de notar que puede ser necesario soltar la LLAVE 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 eliminar 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
 13
Author: Karla Danitza Duran Memijes,
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
2016-01-03 09:23:11

Compruebe cuál es el nombre de la RESTRICCIÓN y el nombre de la CLAVE FORÁNEA:

SHOW CREATE TABLE table_name;

Elimine tanto el nombre de la RESTRICCIÓN como el nombre de la CLAVE FORÁNEA:

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

Espero que esto ayude!

 8
Author: norodin,
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-01-22 03:26:40

Aquí hay una forma de eliminar la restricción de clave externa, funcionará. ALTER TABLE location.location_id SOLTAR LA CLAVE EXTERNA location_ibfk_1;

 3
Author: Rock King Kirant,
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-05-05 10:10:36

Normalmente se produce este error si las tablas utilizan el motor InnoDB. En ese caso, tendría que soltar la clave foránea, y luego hacer el alter table y soltar la columna.

Pero la parte difícil es que no puede soltar la clave foránea usando el nombre de la columna, sino que tendría que encontrar el nombre utilizado para indexarla. Para encontrarlo, ejecute la siguiente selección:

MOSTRAR CREAR región DE TABLA; Esto debe mostrar una fila, en la esquina superior izquierda, haga clic en la opción+, haga clic en el texto botón raio luego haga clic en el ir .allí obtendrá el nombre del índice, algo así:

RESTRICCIÓN region_ibfk_1 CLAVE FORÁNEA (country_id) REFERENCIAS country (id) ON DELETE NO ACTION ON UPDATE NO ACTION Ahora simplemente emita un:

Alter table region drop foreign key region_ibfk_1;

O

Más simplemente simplemente escriba:- alter table TableName drop foreign key TableName_ibfk_1 ;

Recuerde que lo único es agregar _ibfk_1 después de su tablename para hacer así: - TableName _ibfk_1

 1
Author: Abinash Hota,
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-08-09 10:20:52

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

Ya se ha hecho una pregunta similar aquí. Compruebe también aquí para más información.

 0
Author: Ronald Wildenberg,
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-05-23 11:55:05

Prueba esto:

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E
 0
Author: Shailendra Mishra,
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-11-07 14:09:22

Paso 1: show create table vendor_locations;

Paso 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

Funcionó para mí.

 0
Author: Jyothi M,
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-07-31 02:26:27