MySQL: cómo verificar las claves externas relacionadas con una tabla

43

¿Cómo ver las claves externas relacionadas con una tabla en MySql?

Antecedentes : quería eliminar una tabla en MySql que tiene una restricción de clave externa. Cuando lo hago me sale esto:

Error Code: 1217. Cannot delete or update a parent row: a foreign key constraint fails

¿Cómo puedo soltar claves externas relacionadas con la tabla dejando a otros?

estudiante
fuente

Respuestas:

55

En primer lugar, descubra su FOREIGN KEYnombre de restricción de esta manera:

SELECT
  TABLE_NAME,
  COLUMN_NAME,
  CONSTRAINT_NAME,   -- <<-- the one you want! 
  REFERENCED_TABLE_NAME,
  REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'My_Table';

Y luego puede eliminar la restricción nombrada de la siguiente manera:

ALTER TABLE My_Table DROP FOREIGN KEY My_Table_Constraint;

Referencias: 1 y 2 .

Como lo sugiere @SteffenWinkler en los comentarios, si hay más de una tabla de ese nombre en diferentes esquemas / bases de datos, puede agregar un predicado adicional a su cláusula where:

AND TABLE_SCHEMA = 'My_Database';
Vérace
fuente
1
Gracias por la edición. ¡Le responderé haciendo +1 en su pregunta! :-)
Vérace
16
Además, SHOW CREATE TABLE My_Table;.
Rick James
2
@RickJames que solo muestra restricciones en otras tablas que My_Tabletiene. La pregunta pide restricciones sobre las My_Tableotras tablas.
ADTC
2
solo para personas que solo miran esto: esa declaración enumerará todas las restricciones que hacen referencia a una tabla por el nombre especificado en todo el servidor de bases de datos. Limítelo a la base de datos relevante agregandoAND TABLE_SCHEMA = 'My_Database';
Steffen Winkler
3

Editó la consulta anterior. El nombre de la tabla referenciada cambiado a Nombre de tabla como nombre de tabla referenciada es la tabla a la que se hace referencia y, por lo tanto, el resultado de la consulta original no le mostrará las claves foráneas en su tabla.

SELECT
  TABLE_NAME,
  COLUMN_NAME,
  CONSTRAINT_NAME,   -- <<-- the one you want! 
  REFERENCED_TABLE_NAME,
  REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  Table_name = 'case_qualitycontrolcase' and constraint_name = f
syed umar
fuente