2017-04-12 43 views
0

我有以下情形:「電話」子表可謂一舉數得父表通過聯接表,如下:唯一約束「所有者擁有的屬性」通過連接表

enter image description here

CREATE TABLE phone (

    id BIGINT AUTO_INCREMENT, 
    number VARCHAR(16) NOT NULL, 
    type VARCHAR(16) NOT NULL, 

    PRIMARY KEY(id)  

); 

CREATE TABLE employee_phone (

    id BIGINT AUTO_INCREMENT, 
    employee BIGINT NOT NULL, 
    phone BIGINT NOT NULL, 

    PRIMARY KEY(id), 
    CONSTRAINT empl_phone_u_phone UNIQUE(phone), 
    CONSTRAINT empl_phone_fk_employee 
     FOREIGN KEY(employee) 
     REFERENCES employee(id) ON DELETE CASCADE, 
    CONSTRAINT empl_phone_fk_phone 
     FOREIGN KEY(phone) 
     REFERENCES phone(id) ON DELETE CASCADE 

); 

讓愛麗絲和鮑勃住在同一間屋子裏,成爲同一家公司的僱員。人力資源有兩個電話號碼註冊了愛麗絲,而他們只有一個Bob,即房子的座機號碼。 有沒有一種方法可以在數據庫級強制使用此配置爲同一員工(或供應商,或以後出現的任何父代)重複使用電話號碼(數字類型)?或者我將不得不在應用層中處理這些限制嗎?我寧願不使用觸發器或表格反規範化(如在網站上的相關問題中看到的,例如this one,它們與ID一起使用,而不與其他字段一起使用),但是如果沒有其他選擇,我會公開這樣做。我正在使用MySQL。感謝您的關注。

+0

我很困惑。 Alice和Bob可以擁有相同的電話號碼嗎? –

+0

@GordonLinoff是的。例如,他們可能是一對夫婦。 HR需要每個人的電話號碼。 – jpangamarca

回答

0

如果我理解正確的話,你只是想在接線表中的唯一約束:

alter table employee_phone add constraint unq_employeephone_employee_phone unique (employee, phone); 

這將防止對一個給定的僱員或(具有同等約束)的供應商重複。

如果你想所有的電話號碼是在phone表唯一的,就只是把phone唯一約束/索引:

alter table phone add constraint unq_phone_phone unique (phone); 

(您可能要包括的類型以及)。

如果您嘗試添加重複手機,該代碼將返回錯誤。

+0

謝謝。可悲的是,重複的電話號碼是可能的情況下,不能強制執行是唯一的。這就是爲什麼連接表中的唯一約束只包含電話欄(請參閱我在問題中的第一條評論)。 – jpangamarca

+0

@jpangamarca。 。 。員工和電話列上的「加入」表中的唯一約束完全按照您所說的方式執行:「在數據庫級別強制實施一個電話號碼(數字類型)不能爲同一員工(或供應商,或任何父母稍後出現)「。 –

+0

對不起,我不夠清楚。是的,約束的工作方式與ID相同,但我需要的是禁止同一員工使用兩個相同的數字(數字類型,讓我們忘記ID),但允許爲另一個員工使用相同的數字類型僱員。我在手機表中不能有任何獨特的限制。我現在清楚了嗎? – jpangamarca