1

我正在尝试创建一个约束来检查一个项目是否只能有一名员工担任项目负责人,但同时可以有其他员工担任不同的角色。

我的表定义:

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')
) ;

我不清楚如何在约束中表达这一点以及我需要改变什么。如果有人能告诉我我做错了什么,我将不胜感激。

4

1 回答 1

5

你少了一张桌子。您的数据结构需要三个表:

  • Employee,其中列出了有关员工的信息
  • 项目,列出有关项目的信息
  • ProjectEmployee,这是两者之间的关联表

如果你想要一个项目只有一个领导者的约束,那么你可以简单地添加一列到Project被调用ProjectLeader。这将强制执行约束,因为领导者每个项目只有一个插槽。如果您必须有一个领导者,那么添加一个检查约束以确保这不是NULL.

数据模型出现问题的标志是表project_id中的主键project。这意味着对于给定的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
) ;

每个项目只有一个领导职位。您不需要约束来强制执行一体性。

于 2013-08-29T21:05:01.077 回答