我想按其依赖顺序对表名进行排序。
例如:如果我有table users
,users_orders
并且orders
我想按以下顺序获取表名:(users
或orders
无所谓)orders
,,users_orders
。
如果有办法请帮助。
听起来您要转储具有外键定义的表,并且要确保先转储“父”表,以便可以确保引用它们的“子”表可以使用其外键定义。
通常无法执行此操作,因为循环依赖是可能的。
例如,如果您拥有一个用户users
,teams
并且每个用户在哪里都引用了他们所属的团队,但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] 删除。
我来说两句