2013-08-28 62 views
1

我试图在java数据库中创建一个约束。我有两个表:任务和子任务。这些表格具有1:m的关系(任务1:m子任务)。该约束需要检查子任务中的start_date是否早于任务表中的开始日期。不知道,如何做到这一点。 我的代码:Java DB约束

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

您正在使用哪些DBMS? –

+0

我使用DERBY RDBMS – Roman

回答

1

我现在没有关于Derby,但几乎没有DBMS(Access有问题)支持CHECK约束或(类似概念)ASSERTIONs中的子查询,这些约束涉及多个表(Firebird文档说它支持这些)。

你可以阅读有关参与这一优良答案困难的一些细节:Why don't DBMS's support ASSERTION


一个声明的方式来执行你的约束是表subtask添加(冗余)task.start_date柱以及和更改包含该列的外键约束。示例表定义:

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) 
) ; 
+0

太好了,谢谢。这正是我所期待的。 – Roman