将表直接从外键连接到外键

时间:2014-06-13 19:04:15

标签: mysql sql join foreign-keys

我有一个简单的问题,如果我有三个表A,B和C如下:

CREATE TABLE `A` (
`id` VARCHAR(35) NOT NULL,
`name` VARCHAR(20) NOT NULL,
PRIMARY KEY (`id`));

CREATE TABLE `B` (
`emp_id` VARCHAR(35) NOT NULL,
`phone` VARCHAR(7) NOT NULL,
FOREIGN KEY (`emp_id`) REFERENCES `A`(`id`));

CREATE TABLE `C` (
`emp_id` VARCHAR(35) NOT NULL,
`desk_no` INT(11) NOT NULL,
FOREIGN KEY (`emp_id`) REFERENCES `A`(`id`)

直接在C.emp_id = B.emp_id上加入连接或者我应该加入(A.id = B.emp_id)作为R然后加入R.id = C.emp_id是一种好习惯吗?我问,因为你可以直接加入B和C是有意义的,但这是危险的,因为这会将外键加入另一个外键而不是主键的外键吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

这取决于您期望的最终结果。如果您需要表A中的任何列,那么您可能需要加入表A,否则您的外键关系和NOT NULL条件会照顾,您不需要加入表A

答案 1 :(得分:0)

SQL中的外键用于检查和强制引用完整性,而不是连接表。

没有像JOIN这样的规则应该有主键或外键。密钥提供完整性和性能。您可以连接表,即使它们根本没有键。外键和加入用于不同的目的。

答案 2 :(得分:0)

你可以自由地加入,即使这是正确的事情也会受到鼓励。

但是,谨慎。这种连接可以为每个员工产生笛卡尔积。因此,拥有3部电话和4个办公桌的员工将产生12条记录 - 该员工的电话和办公桌的每种组合。此外,在一方或另一方丢失记录的员工将在内部联接中丢失记录。

请注意,加入回原始表可以解决此问题,因为您正在加入数据的不同维度。你只需要意识到这可能会发生。