SQL:非重叠日期

时间:2017-07-27 13:47:38

标签: sql postgresql date

考虑这个架构:

dept_manager( emp_no:int,dept_no:string,from_date:date ,to_date:date)

粗体文字代表键。

我必须基于此创建一个表,强制执行一些属性。

  • 一名员工一次只能担任一个部门的经理。这意味着dept_manager表中的日期条目不能与某个员工重叠。

我现在到目前为止,添加了CHECK约束,确保from_date位于to_date之前。

CREATE TABLE dept_manager (

emp_no INT NOT NULL,
dept_no CHAR(4) NOT NULL,
from_date DATE NOT NULL,
to_date DATE NOT NULL,

PRIMARY KEY (emp_no, dept_no, from_date),
CHECK (from_date < to_date),
...
)

现在我必须添加确保询问条件的部分。我想过使用FOREIGN KEYs,但我不知道如何添加它。

1 个答案:

答案 0 :(得分:0)

您也可以创建触发器以检查插入前的日期

 CREATE TRIGGER dept_manager_trg
 BEFORE INSERT
     ON dept_manager
    FOR EACH ROW
EXECUTE PROCEDURE dept_manager_no_overlap();

 CREATE OR REPLACE FUNCTION dept_manager_no_overlap
 RETURNS trigger AS $BODY$

 BEGIN
    IF NEW.from_date > (SELECT q.to_date
                          FROM dept_manager d
                         INNER JOIN (SELECT emp_no
                                           ,max(to_date) as to_date
                                       FROM dept_manager
                                      GROUP BY emp_no) q
                            ON d.emp_no = q.emp_no
                           AND d.to_date = q.to_date
                         WHERE d.emp_no = NEW.emp_no)
       THEN RETURN NEW;
       ELSE RAISE EXCEPTION 'Overlap Date';
    END IF;
 END;