2017-07-26 86 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