我试图在java中创建一个约束。我有两个表:任务和子任务。这些表具有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表示约束?任何帮助都是非常感谢的。
发布于 2013-08-28 22:47:07
我现在不了解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)
) ;https://stackoverflow.com/questions/18497779
复制相似问题