如何在数据库中建立外键

时间:2014-08-26 15:47:53

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

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

1 个答案:

答案 0 :(得分:0)

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

是否有软件在两个表之间建立外键关系?绝对。它被称为" SQL数据定义语言"它随每个SQL产品一起提供。您可以在创建子表时创建关系:在外键的字段名称和定义之后放置一个"引用"子句和名称父表,如"创建表城市(city_id int,city_name varchar(40),country_id int引用国家(country_id))"。您也可以稍后添加外键,但语法因数据库产品而异。

是否有软件让您跟踪关系?这是一个完全不同的问题。我不确定你的意思是" trace"。如果你只是说,"告诉我现有的外键关系",那么肯定。不同的数据库产品有不同的方法来执行此操作,您必须查看您的文档。 MySQL有" show"将显示有关表的各种信息的命令,包括外键。

今天的大多数数据库都支持" information_schema&#34 ;,这是一组描述数据库的数据库表。您可以查询此内容以获取外键关系列表。

如果你的意思是想要漂亮的图表...那里有产品,我已经看过它们,但是我没有使用它们而且无法提供任何建议。

更新

好的,根据你的评论,我认为你要说的是你有一堆数据没有明确说明外键关系,你想找到外键可能是什么。< / p>

我不知道有任何软件产品可以做到这一点。一点点思考就会表明问题无法彻底解决。也就是说,我们无法编写软件,让我们可以100%确定地说我们现在知道外键是什么。

我看到你能做到这一点的唯一方法是在一个表的一列中查找始终存在于另一个表的某列中的值。就像说在表X第4列中我们发现值都是&#34; foo&#34;,&#34; bar&#34;和&#34; plugh&#34;。然后我们查看表Y并找到3条记录,第1列包含值&#34; foo&#34;,&#34; bar&#34;和&#34;插入&#34;。我说第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)中找到的事实可能只是巧合。

如果有100个不同的值,我们怀疑是表Y中的主键,并且只有95个从表X中引用,那么它可能仍然是外键。由于各种原因,通常会记录未记录的记录。但是,如果仅引用其中的10个......现在它更难说。也许,也许不是。

一般来说,我怀疑文本字段中的常用值比数字字段中的常用值更有意义。两个字段都包含值&#34; 3&#34;证明不多。两个字段都包含&#34; bragnar&#34;似乎不太可能是巧合。

我认为你最好的选择是用智慧和直觉来攻击这个。将所有表加载到数据库中。然后看看他们是否有明显的主键。如果您知道表中的数据真的应该是MEAN,那么您应该能够对可能的键做出一些猜测。就像您知道这是贵公司生产的零件表一样,您可以查找可识别的零件编号等。查找没有重复值的字段。与选择x1一样,从x组计数()x1计数()> 1,如果没有这样的记录,则可能是主键。如果两个记录具有相同值的任何情况,则它不能作为主键。 (好吧,也许你必须考虑坏数据的可能性。)然后在其他表中查找类似于这些值的值。查询以查看表Y中的所有值是否存在于表Y中,例如select * from x where not exists(select * from y,其中y.y1 = x.x4)。

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