我正在尝试在java DB中创建约束。我有两个表:任务和子任务。这些表有1:m的关系(任务1:m子任务)。约束需要检查子任务中的start_date是否早于任务表中的开始日期。 不确定,如何做到这一点。 我的代码:
ALTER TABLE subtask
ADD CONSTRAINT c1 CHECK(
s.start_date >= (SELECT t.start_date
FROM task t, subtask s
WHERE t.start_date = s.start_date)
)
这给了我错误:
'subquery' may not appear in a CHECK CONSTRAINT definition because it may return non-deterministic results.
如何在SQL中表达约束?任何帮助表示赞赏。
答案 0 :(得分:1)
我现在不关于Derby,但几乎没有DBMS(除了有问题的Access)支持CHECK
约束中的子查询或(类似概念)ASSERTIONs
这些约束涉及多个表(Firebird文档说它支持这些)。
您可以阅读有关此精确答案所涉及的困难的一些详细信息:Why don't DBMS's support ASSERTION
以声明方式强制执行约束的一种方法是在表task.start_date
中添加(冗余)subtask
列,并更改外键约束以包含该列。样本表定义:
CREATE TABLE task
( task_id INT NOT NULL PRIMARY KEY
, task_start_date DATE NOT NULL
, CONSTRAINT task_id_start_date_UQ
UNIQUE (task_id, task_start_date)
) ;
CREATE TABLE subtask
( subtask_id INT NOT NULL PRIMARY KEY
, start_date DATE NOT NULL
, task_id INT NOT NULL
, task_start_date DATE NOT NULL
, CONSTRAINT task_subtask_FK
FOREIGN KEY (task_id, task_start_date)
REFERENCES task (task_id, task_start_date)
, CONSTRAINT subtask_should_not_start_before_task_CK
CHECK (start_date >= task_start_date)
) ;