考虑这个架构:
dept_manager( emp_no:int,dept_no:string,from_date:date ,to_date:date)
粗体文字代表键。
我必须基于此创建一个表,强制执行一些属性。
我现在到目前为止,添加了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,但我不知道如何添加它。
答案 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;