2013-08-29 192 views
1

我試圖創建一個約束來檢查一個項目只能有一個員工的角色是項目負責人,但同時可以讓其他員工擁有不同的角色。SQL檢查約束

我的表定義:

CREATE TABLE employee 
(employee_id INT NOT NULL PRIMARY KEY 
,employee_role VARCHAR(15) NOT NULL 
, CHECK (employee_role in ('project_leader', 'administrator', 'member')) 
) 


CREATE TABLE project 
(project_id INT NOT NULL PRIMARY KEY 
, name VARCHAR(50) 
, employee_id INT NOT NULL 
, employee_role VARCHAR(15) NOT NULL 
, CONSTRAINT employee_project_FK 
    FOREIGN KEY (employee_id, employee_role) 
    REFERENCES employee (employee_id, employee_role) 
, CONSTRAINT only_one_project_leader 
    CHECK (employee_role = 'project_leader') 
) ; 

這是我不清楚如何能夠在約束,我需要改變什麼來表達。如果有人會告訴我我做錯了什麼,我會很感激。

回答

5

您缺少一個表格。你的數據結構要三個表:

  • 員工,其中列出了有關員工
  • 項目,其中列出了有關項目
  • ProjectEmployee,這是兩個

如果之間的關聯表信息你想要一個約束項目只有一個領導者,那麼你可以簡單地將一列添加到Project,調用ProjectLeader。這將強制約束,因爲領導者每個項目只有一個插槽。如果你必須有一個領導,然後添加一個檢查約束,以確保這不是NULL

數據模型出現問題的跡象是project_idproject表中的主鍵。這意味着對於給定的project_id,只有一名員工。我不認爲這是你的意圖。

編輯:

的表看起來是這樣的:

CREATE TABLE project 
(project_id INT NOT NULL PRIMARY KEY, 
    name VARCHAR(50), 
    project_leader int references employee(employee_id) 
) ; 

CREATE TABLE projectemplyee 
(projectemployee_id INT NOT NULL PRIMARY KEY, 
    project_id int references project(project_id), 
    employee_id int references employee(employee_id), 
    employee_role VARCHAR(15) NOT NULL 
) ; 

只有一個對每個項目的領導者插槽。你不需要一個約束來強制一致性。

+0

好的,如果我用CONSTRAINT only_one_project_leader CHECK(employee_role ='project_leader')創建ProjectEmployee表ProjectEmployee(project_idPK,employee_idPK,employee_roleFK)。這會解決問題嗎? – Roman

+2

@ user1967222:如果project_leader是項目表的屬性,則不需要檢查約束,因爲您不能將多個ID放入該列。 –

+1

這個解決方案的唯一缺點是項目負責人不會自動成爲項目員工(這可能或可能不是Oa的好東西)。但與德比,我不認爲有更好的解決方案。對於其他DBMS,部分唯一索引可以確保'p​​rojectemployee'表中的單個project_leader。 –