嗯,你说“换句话说”,然后你问了一个完全不同的问题。
是否有软件可以在两个表之间建立外键关系?绝对地。它被称为“SQL 数据定义语言”,它随每个 SQL 产品一起提供。您可以在创建子表时创建关系:在字段名称和外键定义之后放置“引用”子句并命名父表,如“create table city (city_id int, city_name varchar(40), country_id int 引用国家 (country_id))"。您也可以稍后添加外键,但语法会因数据库产品而异。
是否有软件可以让您追踪关系?这是一个完全不同的问题。我不确定您所说的“跟踪”到底是什么意思。如果您只是说“向我展示现有的外键关系”,那么当然可以。不同的数据库产品有不同的方法来做到这一点,您必须查看您的文档。 MySQL 具有“显示”命令,可以显示有关表的各种信息,包括外键。
当今大多数数据库都支持“information_schema”,这是一组描述数据库的数据库表。您可以查询它以获取外键关系列表。
如果你的意思是你想要漂亮的图表......那里有产品,我见过它们,但我不使用它们,无法提供任何建议。
更新
好的,根据您的评论,我认为您想说的是,您有一堆没有明确说明外键关系的数据,并且您想找出外键可能是什么。
我不知道有任何软件产品可以做到这一点。稍加思考就会表明问题无法彻底解决。也就是说,我们无法编写能够让我们说我们现在 100% 确定地知道外键是什么的软件。
我认为您可以这样做的唯一方法是在一个表的一列中查找始终存在于另一表的某些列中的值。就像说在表 X 的第 4 列中,我们发现这些值都是“foo”、“bar”和“plugh”。然后我们查看表 Y 并找到 3 条记录,第 1 列包含值“foo”、“bar”和“plugh”。我想说第 1 列很有可能是表 Y 的主键,而 X(4) 是指向 Y 的外键。
但是假设我们发现表 X 的第 4 列是一个包含 1、2 或 3 的整数。表 Y 有 100 条记录,其中第 1 列的值介于 1 和 1,000,000 之间,包括值 1、2 和 3。是X(4) Y 的外键?可能不是。 X(4) 中的所有值都在 Y(1) 中找到这一事实可能只是一个巧合。
如果我们怀疑表 Y 中的主键有 100 个不同的值,而其中只有 95 个是从表 X 中引用的,那可能仍然是外键。由于各种原因,经常有一些记录未被引用。但是,如果只引用其中的 10 个……现在就更难说了。也许也许不会。
一般来说,我怀疑文本字段中的常见值比数字字段中的常见值更有意义。两个字段都包含值“3”证明很少。两个都包含“bragnar”的字段似乎不太可能是巧合。
我认为你最好的选择是使用智慧和直觉来解决这个问题。将所有表加载到数据库中。然后看看他们是否有明显的主键。如果您知道表中的数据实际上应该是什么意思,您应该能够对可能的键进行一些猜测。就像您知道这是您公司生产的零件表一样,您可以查找可识别的零件编号等。查找没有重复值的字段。就像 select x1, count() from x group by x1 的 count()>1,如果没有这样的记录,那可能是主键。如果存在两条记录具有相同值的任何情况,则它不能是主键。 (好吧,也许您必须考虑坏数据的可能性。)然后在其他表中查找与这些值相似的值。执行查询以查看表 Y 中存在的表 X 中的所有值,例如 select * from x where not exists (select * from y where y.y1=x.x4)。
我想,你可以编写一个程序,检查每个表中的每一列,并列出唯一的列,然后检查每个表中的每一列,并列出所有值都为在另一个表的唯一值中找到。那会给你候选人。然后你必须看看什么是有意义的。