在我的采访中,我被问及"外键有什么用?"
我的回答是:
"它用于引用下一个表的主键,可用于加入表"。
然而,他仍然说,#34;你不在这一点上#34;。我试过谷歌,但我仍然找不到。
那么答案是什么呢?
答案 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 。
例如,假设您有两个表,第一个表包含这些列,pid
,fname
,lname
其中pid
是表1的主键。然而,表2包含nid
,value
,pid
这些列,此处nid
是表2的主键,pid
将充当外键对于表二。此pid
将充当两个给定表之间的链接。在表2中pid
的帮助下,我们可以从第二表的value
或fname
获取lname
数据。