使用外键

时间:2016-04-24 05:42:24

标签: mysql sql database sqlite

在我的采访中,我被问及"外键有什么用?"

我的回答是:
"它用于引用下一个表的主键,可用于加入表"。

然而,他仍然说,#34;你不在这一点上#34;。我试过谷歌,但我仍然找不到。

那么答案是什么呢?

3 个答案:

答案 0 :(得分:4)

外键是一种特定的约束 约束是限制数据库中值的规则 请按照此链接查找详细答案(它是针对Oracle的,而不是MySql,但外键在所有数据库中以相同的方式工作):
http://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm

  

使用约束来定义完整性约束 - 一种规则   限制数据库中的值。 Oracle Database允许您创建   六种类型的约束,允许您以两种方式声明它们。

     

这里简要描述了六种类型的完整性约束   更完整的“语义学”:

     

NOT NULL约束禁止数据库值为空。

     

唯一约束禁止多行具有相同的值   在同一列或列的组合,但允许一些值   是空的。

     

主键约束组合了NOT NULL约束和唯一   单个声明中的约束。也就是说,它禁止多个   行在同一列或其组合中具有相同的值   列并禁止值为空。

     

外键约束要求一个表中的值与值匹配   在另一张表中。

     

检查约束要求数据库中的值符合a   指定条件。

     

根据定义,REF列引用另一个对象类型中的对象   或在关系表中。 REF约束允许您进一步描述   REF列与其引用的对象之间的关系。

从定义中可以看出 - 外键是一个约束,它以这种方式工作,它只是检查一个表的列中的给定值是否存在于另一个表的给定列中。

答案 1 :(得分:2)

有趣的是,您在此处标记了mysql,因为MySQL中的默认MyISAM引擎不保持参照完整性。换句话说,它实际上允许您创建外键,但它不强制执行任何操作(请参阅here)。

因此,如果Table2.ColumnB拥有Table1.ColumnA的外键,并且您尝试向Table2.ColumnB添加Table1.ColumnA中不存在的值,那么它就会让您。它不会为您强制执行约束。然而,其他MySQL引擎如InnoDB支持这些约束。

我早期的所有数据库工作都在MySQL中使用MyISAM引擎。所有外键约束都必须在编程级别强制执行,因为数据库不会为我执行。当我开始使用SQL Server时,这导致了一些问题,因为我没有正确设置外键约束。

答案 2 :(得分:1)

一个表格中的 FOREIGN KEY 指向另一个表格中的 PRIMARY KEY 。 例如,假设您有两个表,第一个表包含这些列,pidfnamelname其中pid是表1的主键。然而,表2包含nidvaluepid这些列,此处nid是表2的主键,pid将充当外键对于表二。此pid将充当两个给定表之间的链接。在表2中pid的帮助下,我们可以从第二表的valuefname获取lname数据。