Java DB约束

时间:2013-08-28 20:40:10

标签: sql constraints derby

我正在尝试在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中表达约束?任何帮助表示赞赏。

1 个答案:

答案 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)
) ;