Bug*_*njo 7 mysql foreign-keys database-schema
我想获取按其依赖顺序排序的表名。
例如:如果我有 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;
Run Code Online (Sandbox Code Playgroud)
MySQL 直到 MySQL 8.0(仍在开发中)才支持递归查询。因此,您可能必须将依赖项数据提取到您的应用程序中,并确定要转储它们的顺序。
但是您仍然无法以这种方式处理周期。您必须使用我上面描述的替代方法之一。
归档时间: |
|
查看次数: |
1551 次 |
最近记录: |