【发布时间】:2016-05-17 20:23:16
【问题描述】:
我有一个表(oracle 数据库),用于存储部门及其员工。
表:部门员工
╔══════════════╦═══════════╦═════════════╦═══════════════════════════╗
║ Column ║ Data type ║ Nullability ║ Description ║
╠══════════════╬═══════════╬═════════════╬═══════════════════════════╣
║ DepartmentID ║ INT ║ NOT NULL ║ Foreign Key to Department ║
║ EmployeeID ║ INT ║ NOT NULL ║ Foreign Key to Employee ║
║ StartDate ║ DATE ║ NOT NULL ║ Date the employee joined ║
║ EndDate ║ DATE ║ NULL ║ Date the employee left ║
╚══════════════╩═══════════╩═════════════╩═══════════════════════════╝
员工应该只有一 (1) 个他目前工作的部门。 他工作的部门没有 EndDate (= NULL)。
所以查询将是:
选择 * FROM部门员工 WHERE EmployeeID = 1 AND EndDate 为空;
当员工不再在公司工作时,他将没有 (0) 个具有 EndDate 的部门。
所以我的问题是: 如何确保表中只有 1 行或 0 行的 EmployeeID 的 EndDate 设置为 NULL? 谢谢。
【问题讨论】:
-
就像一个想法..您可以添加一个coulum来指定员工是否正在工作。
Active = Y/N -
只需在该 UNIQUE(employeeID,EndDate) 上放置一个唯一索引。顺便说一句,更合适的方法是使用开放式结束日期,例如 - 31/12/2999。
-
@Moudiz 该列已经在 Employee 表中
-
@sagi 唯一索引听起来像是要走的路。我不喜欢使用开放式结束日期(例如,您想计算某人在部门工作的天数)
-
所以你不使用 end_date,你使用当前日期或其他日期。一个空值将如何帮助您比现在很远的开放日期更好?不应使用 Null 值,因为它可能会在以后导致错误。