CK能否在另一个表中引用FK引用CK?

时间:2015-10-13 17:48:52

标签: database foreign-keys relational-database primary-key candidate-key

举个例子:

Department (**Dept**, Dept_name)  
Employee(**RegNo**, FirstName, LastName, BirthDate, Dept_fk, Salary, City)  

Dept_name是Department表的CK。

由于Dept_name未在Department表中设置为主键,因此Dept_fk可以成为Employee中CK(Dept_fk,FirstName,LastName,Birthdate)的一部分吗?

编辑:我修改了一些attribut名称,以便更容易理解。 Dept_fk是引用Department表中Dept的外键。

1 个答案:

答案 0 :(得分:0)

给定表格的#34; CK(候选键)的两个定义"是:

  • 表格中设置的列,它在功能上确定每一列,并且不包含任何较小的此类集合。
  • 表中设置的列,其子行值是唯一的,并且不包含任何较小的此类集。

如果没有我们使用的定义所需的信息,我们无法确定表的CK。例如所有FD(功能依赖性),或FD的规范封面或其子行值唯一的所有列集等。该信息总是可以在不涉及另一个表的情况下表达。

我们可以选择一张桌子的CK来打电话"" PK(主键)。 PK与关系理论无关。 (如果你使用的是ER方法,它有关于PKs和CKs的规则,那么你应该参考并标记它。)

  

Dept不能成为Employee表中候选键(例如:Dept,FirstName,LastName,Birthdate)的一部分,因为Dept未在Department表中设置为主键

部门员工中,因此它不能成为其CK的一部分。但是如果你添加它,它是否是它的CK是独立于其他表。

如果你问你是否可以根据部门中的CK与PK之间的区别来做某事:PK总是无关紧要。

如果" Dept" s是" Dept#"的错别字:Dept#是或不是Department表的PK的事实与CK没有关系另一张桌子。无论是PK还是CK总是无关紧要。

  

但是,我是否仍然可以将Dept称为候选键,只知道Dept是Department表中的候选键?

是部门的CK。所以在英语中我们可以说它是一个CK。但成为一个CK就是成为特定表格的CK

也许你的意思是"我还可以打电话给Dept一个CK" of Employee 只知道..."。只有你表明它是一个。而且它是否独立于任何其他表格。

(也许你应该在这个问题上调用一些FK?)

PS列可以出现在多个表中,而它们之间没有FK。 ("参考"仅在您谈论FK时才有用。)不同的列可以在它们之间具有FK。当且仅当一组列中的所有子行值出现在另一列("引用的")中时,才有FK。 SQL FK只需要转到超级密钥(CK的超集)而不是CK。 FK可以来自任何列集:FK只是引用表中的(超级)键。了解FD,超级密钥,CK,PK,FK(到CK或超级密钥)的定义