MySQL:如何检查与表相关的外键


43

如何在MySql中查看与表相关的外键?

背景:我想在MySql中删除具有外键约束的表。当我这样做时,我得到:

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

我该如何删除与表相关的外键而使其他人离开。

Answers:


55

首先,FOREIGN KEY以这种方式找出您的约束名称:

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';

然后,您可以通过以下方式删除命名约束:

ALTER TABLE My_Table DROP FOREIGN KEY My_Table_Constraint;

参考:12

正如@SteffenWinkler在注释中所建议的那样,如果在不同的模式/数据库中有多个该名称的表,则可以在where子句中添加另一个谓词:

AND TABLE_SCHEMA = 'My_Database';

1
感谢您的修改-我将为您的问题+1做出回报!:-)
Vérace

16
另外,SHOW CREATE TABLE My_Table;
里克·詹姆斯

2
@RickJames仅显示对具有其他表的约束My_Table。问题要求My_Table其他表具有约束。
ADTC

2
仅针对那些只看一眼的人:该语句将列出整个数据库服务器上通过指定名称引用表的所有约束。通过添加AND TABLE_SCHEMA = 'My_Database';
Steffen Winkler

3

编辑了上面的查询。将“引用表名”更改为“表名”作为“引用表名”是被引用的表,因此原始查询的结果不会向您显示表上的外键。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.