1

我正在尝试在 java DB 中创建一个约束。我有两个表:任务和子任务。这些表具有 1:m 关系(任务 1:m 子任务)。约束需要检查子任务中的开始日期不早于任务表中的开始日期。不确定,如何做到这一点。我的代码:

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

4

1 回答 1

1

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

您可以阅读有关这个​​很好的答案所涉及的困难的一些详细信息:为什么 DBMS 不支持 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)
) ;
于 2013-08-28T22:47:07.923 回答