2017-07-26 124 views
0

下面的MySQL代码...多对一的关系?

CREATE TABLE Employee (
    id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    departmentId TINYINT UNSIGNED NOT NULL 
     COMMENT "CONSTRAINT FOREIGN KEY (departmentId) REFERENCES Department(id)", 
    firstName VARCHAR(20) NOT NULL, 
    lastName VARCHAR(40) NOT NULL, 
    email VARCHAR(60) NOT NULL, 
    ext SMALLINT UNSIGNED NULL, 
    hireDate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    leaveDate DATETIME NULL, 
    INDEX name (lastName, firstName), 
    INDEX (departmentId) 
) 

CREATE TABLE Department (
    id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(40), 
    UNIQUE (name) 
) 

...定义了许多给员工和部门之间的一个关系。换句话说,一个员工只能在一个部门,但一个部门可以有很多员工。但有人可以更详细地解释这一点吗?上面的代码是如何告诉我的?

+0

仅供参考 - 您可能不应该为departmentId使用tinyint,您会遇到麻烦。只需使用Int。 – Difster

+0

这些表之间没有定义关系。阅读['CREATE TABLE'](https://dev.mysql.com/doc/refman/5.7/en/create-table.html)语句的语法。 – axiac

+0

@axiac原则上你是对的,但'comment'被yii框架读取并用于自动定义关系。 – Grateful

回答

0

通过查看引用表的外键,有时很容易辨别两个(或多个)表之间的关系。

一个简单的规则是,如果外键在它自己的表中是一个主键本身,则该关系可能是1比1,而如果该外键不是它自己的表中的主键,则该关系可能1到很多,其中表格在“多”端具有外键。

在您的示例中,对于Employee中的departmentID,它不是主键。因此,在这种情况下,一个部门可以同时被很多员工参考,因此可以建立“一对多”关系。

但是,在您引用的示例from mkyong.com中,表(stock和stock_detail)都使用stock_id作为主键。在这种情况下,可以建立“1对1”关系。

考虑一下:stock和stock_detail表将只包含一个具有特定值的唯一记录,如stock_id。 I made a sample here

+0

在mkyong.com的例子中,是否可以在任何一个表中定义外键而没有太大影响?在上面的例子中呢......如果我让'Department'将Employee的外键定义为'Employee'表,那么它真的很重要吗?我的意思是只要键的属性(主键或不键)仍然存在两端相同? – Grateful

+0

您必须从Employee(Employee.departmentID到Department.ID)定义外键关系。这很简单,你将如何建立一个从部门到员工的关系?员工的主键是ID,但您不能将部门ID转换为员工ID,对吗? 如果您指的是非主键字段,那么至少这个关系对我来说似乎毫无意义。 –

+0

我明白了。所以基本上外键必须引用一个唯一的键,不管它是否是主键。在上面的例子中,'Employee'表中的'departmentId'列不是唯一的...所以它不能被'Department表中的'id'引用。真的吗? – Grateful

1

这一行在这里:departmentId TINYINT UNSIGNED NOT NULL COMMENT "CONSTRAINT FOREIGN KEY (departmentId) REFERENCES Department(id)"是指部门表的id字段。在Department中,每个部门只能有一次实例,但在Employee中,许多员工可能位于同一个部门,因此这是一对多的,从Department -> Employee

这是否合理?另外,如果您要更改部门本身的名称,则不需要更新Employee表中的任何内容,因为它自动参照Deparment表。

+0

好的,但在这种情况下,我不明白为什么以下链接描述的是1对1关系。由于'stock_detail'正在为'stock'定义一个外键约束......这不会使它成为'stock - > stock_detail'中的一对多关系吗? https://www.mkyong.com/mysql/how-to-define-one-to-one-relationship-in-mysql/ 为什么链接是1-1而我的例子1-多? – Grateful

+0

在您提供的链接中,左表中的ID也是主表中的主键。这意味着左表中只有一个ID也可以存在于右表中。尽管你会使用1对1的关系,但这很少见。如果你认为你需要它,那就停下来仔细检查你的数据结构,看看它是否是最好的解决方案,并且可能咨询其他人。它**可能**是正确的解决方案,但你最好是确定的,否则它会在稍后回来咬你。 – Difster

+0

从那时起,一列['COMMENT'](https://dev.mysql.com/doc/refman/5.7/en/create-table.html#idm139834247609232)被用来定义一个约束?这只是一个评论,而不是一个约束,而不是一个链接到其他表,什么都没有。从服务器的角度来看,只是一团被忽略的文本。阅读['CREATE TABLE']的语法(https://dev.mysql。com/doc/refman/5.7/en/create-table.html)声明。 – axiac