【问题标题】:MySQL MyISAM How do I see all foreign keys TO and FROM a table or column?MySQL MyISAM 如何查看表或列的所有外键 TO 和 FROM?
【发布时间】:2019-04-08 18:09:52
【问题描述】:

如何从使用 MyISAM 构建的 MySQL 数据库中获取指向(和从)特定表和/或特定列的所有外键约束的列表?这与 this InnoDB question 相同,但 MyISAM 特定于 MySQL。

考虑规范航空公司数据集。当我根据链接问题的接受答案 (TO) 和节点的答案 (FROM) 运行以下两个查询时,我的结果是空集。

显示所有指向“mytable”的外键

SELECT 
  TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_SCHEMA, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = 'airlines' AND  -- <database>
  REFERENCED_TABLE_NAME = 'airports';  -- <table> flights, carriers, planes

显示所有指向 FROM 'mytable' 的外键

SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' 
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'airlines'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'carriers';

我是否误认了 REFERENCED_TABLE_SCHEMA?此查询是否仅在 InnoDB 中有效?

【问题讨论】:

  • MyISAM 不支持外键; MySql 允许在 CREATE TABLE 中使用它们,但如果引擎是 MyISAM 则忽略它们。

标签: mysql foreign-keys myisam


【解决方案1】:

https://dev.mysql.com/doc/refman/8.0/en/myisam-storage-engine.html 说:

外键支持:否

现在不建议使用 MyISAM。 MySQL 显然正在逐步淘汰它。

另请参阅我对MyISAM versus InnoDB 的回答,了解为什么我们都应该避免使用 MyISAM。

【讨论】:

  • ALTER TABLE x ENGINE=InnoDB切换也超级方便。
  • @tadman 我是 SQL 和 MySQL 的新手。我可以一次更改所有表吗?
  • 如果您首先备份所有内容,是的,更改它们通常是一个直接的过程。简单的方法是使用MySQL Workbench,您可以在其中翻转下拉列表并自动转换它们。如果有很多表要做,你也可以很容易地编写这个脚本,你只需要生成正确数量的ALTER TABLE 语句。有很多方法可以生成这个,从脚本语言到记事本/一些编辑器到 Excel/Google 文档,只要你得到正确格式的命令。
  • 首先在数据库的测试副本上执行此操作,以消除任何潜在问题。大多数时候都很好,但值得知道是否有问题。每次转换都可能需要一些时间,并且需要在转换完成之前锁定表,因此请在此处计划一些停机时间。
  • 换句话说,不,您不能一次更改所有表。您可以一次更改一个,但生成一系列命令来做到这一点并不难。
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多