【问题标题】:How to establish foreign keys in a database如何在数据库中建立外键
【发布时间】:2014-08-26 15:47:53
【问题描述】:

是否有软件可以让您跟踪数据库中表之间存在的关系?换句话说,一个允许在两个或多个表之间建立外键的软件?谢谢

【问题讨论】:

  • 您将 MySQL 放在了标签行中,但您可能想在问题中提及它。
  • Navicat 会这样做..
  • @thebjorn 我有表格的 .csv 文件,Navicat 可以很好地处理这些文件吗?
  • @LuigiEsposito no(Navicat 将从数据库中的表生成 ER 图,包括定义的外键关系)。没有魔杖(据我所知)可以从原始表数据中预测 fkey 关系。
  • @thebjorn 不幸的是,你所做的只是指出我已经拥有的东西......等待其他用户的更多信息。还是谢谢你

标签: mysql database foreign-keys key foreign-key-relationship


【解决方案1】:

嗯,你说“换句话说”,然后你问了一个完全不同的问题。

是否有软件可以在两个表之间建立外键关系?绝对地。它被称为“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)。

我想,你可以编写一个程序,检查每个表中的每一列,并列出唯一的列,然后检查每个表中的每一列,并列出所有值都为在另一个表的唯一值中找到。那会给你候选人。然后你必须看看什么是有意义的。

【讨论】:

  • 根据他的评论,我假设他有一组 .csv 文件,他想自动连接在一起。 ..或者他只是想在表格之间直观地画线(跟踪)以识别 fkeys..?
  • 可能是我暴露问题不准确,现在我努力做得更好。我制作了 3 个表:表 1 A-B-C-D-E-F-G 0-1-2-3-4-5-6-7 表 2 A-B-C 8-9-3 表 3 H-I-L 03/10/11 @Jay 我想看看是否有这三个表之间的外键,先验地知道它存在,但信息已经丢失。这些表是 csv 格式的,因此它们几乎没有信息可以处理。我现在更清楚了?
猜你喜欢
  • 1970-01-01
  • 2019-07-02
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多