MySQL 表名按依赖顺序排序

Bug*_*njo 7 mysql foreign-keys database-schema

我想获取按其依赖顺序排序的表名。

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

如果有办法请帮忙。

Bil*_*win 6

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

通常您不能这样做,因为循环依赖是可能的。

例如,如果你有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;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 非常感谢!有用!我在转储开始时完成了`SET FOREIGN_KEY_CHECKS=0`,并在完成后完成了`SET FOREIGN_KEY_CHECKS=1` 并且它起作用了!谢谢! (3认同)