MySQL表名称按依赖关系顺序排序

Buglinjo

我想按其依赖顺序对表名进行排序。

例如:如果我有table usersusers_orders并且orders我想按以下顺序获取表名:(usersorders无所谓)orders,,users_orders

如果有办法请帮助。

比尔·卡温

听起来您要转储具有外键定义的表,并且要确保先转储“父”表,以便可以确保引用它们的“子”表可以使用其外键定义。

通常无法执行此操作,因为循环依赖是可能的。

例如,如果您拥有一个用户usersteams并且每个用户在哪里都引用了他们所属的团队,但teams同时又引用captain了作为该团队的队长的特定用户,那么您要首先列出users还是teams首先列出

一种替代解决方案是按您想要的任何顺序输出所有表,但没有外键定义。列出所有表及其数据之后,然后使用ALTER TABLE...ADD FOREIGN KEY命令跟随

另一个替代解决方案-mysqldump使用的解决方案-SET FOREIGN_KEY_CHECKS=0最初是这样。然后,您可以定义外键约束,而不必担心是否已创建了引用表。这些表以字母顺序转储。

但是要直接回答您的问题:您可以使用INFORMATION_SCHEMA来发现存在哪些表依赖关系。

SELECT table_schema, table_name, 
  GROUP_CONCAT(column_name ORDER BY ordinal_position) AS `columns`,
  MAX(referenced_table_schema) AS referenced_table_schema,
  MAX(referenced_table_name) AS referenced_table_name,
  GROUP_CONCAT(referenced_column_name ORDER BY ordinal_position) AS `ref_columns`
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE referenced_table_schema IS NOT NULL
GROUP BY table_schema, table_name;

MySQL直到MySQL 8.0(仍在开发中)才支持递归查询。因此,您可能必须将依赖项数据提取到应用程序中,并弄清楚要转储它们的顺序。

但是您仍然无法以这种方式处理周期。您必须使用我上面描述的替代方法之一。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章