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

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

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

如何删除与表格相关的外键。

有帮助吗?

解决方案

首先,以这种方式找出您的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';
.

如果您在不同的模式中有多个表,则您也可以添加(到WHERE子句)。

AND TABLE_SCHEMA = 'My_Database';
.

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

ALTER TABLE My_Table DROP FOREIGN KEY My_Table_Constraint;
.

参考: 1 2

其他提示

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

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
.

在mysql 5.7中。您可以找到表格关系和关系规则。

SELECT
  DISTINCT a.TABLE_NAME,
  a.CONSTRAINT_NAME,
  b.DELETE_RULE,
  b.UPDATE_RULE,
  a.REFERENCED_TABLE_NAME,
  a.COLUMN_NAME,
  a.REFERENCED_COLUMN_NAME,
  a.TABLE_SCHEMA
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE a
JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS b USING (CONSTRAINT_NAME)
WHERE
    a.TABLE_SCHEMA = "DATABASE_NAME" AND
    a.REFERENCED_TABLE_NAME = 'TABLE_NAME'
ORDER BY a.TABLE_NAME ASC;
.

您可以直接执行此查询的输出以删除引用表的约束。



select concat('ALTER TABLE ' ,CONSTRAINT_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ' ,CONSTRAINT_NAME ,';' )
from  information_schema.REFERENTIAL_CONSTRAINTS  
where REFERENCED_TABLE_NAME='<<table to be dropped >> ';


.

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top