数据库
首页 > 数据库> > MySQL表名称按依赖关系顺序排序

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

作者:互联网

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

例如:如果我有表用户,users_orders和订单,我想按以下顺序获取表名:用户(或订单无关紧要),订单,users_orders.

如果有办法请帮助.

解决方法:

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

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

例如,如果您有用户和团队,并且每个用户都有对他们所属团队的引用,但是团队也有针对特定用户(该团队的队长)的引用队长,您要先列出用户还是首先列出团队?

一种替代解决方案是按您想要的任何顺序输出所有表,但没有外键定义.在列出所有表及其数据之后,然后使用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(仍在开发中)才支持递归查询.因此,您可能必须将依赖项数据提取到应用程序中,并弄清楚要转储它们的顺序.

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

标签:database-schema,foreign-keys,mysql
来源: https://codeday.me/bug/20191111/2018380.html