首页
学习
活动
专区
圈层
工具
发布

Java约束
EN

Stack Overflow用户
提问于 2013-08-28 20:40:09
回答 1查看 1.4K关注 0票数 1

我试图在java中创建一个约束。我有两个表:任务和子任务。这些表具有1:m关系(任务1:m子任务)。约束需要检查子任务中的start_date是否早于任务表中的开始日期。不确定这是怎么做到的。我的代码:

代码语言:javascript
复制
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表示约束?任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-28 22:47:07

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

您可以阅读一些有关这个精细答案所涉及的困难的详细信息:Why don't DBMS's support ASSERTION

以声明方式强制执行约束的一种方法是在表task.start_date中添加一个(冗余) subtask列,并将外键约束更改为包含该列。样本表定义:

代码语言:javascript
复制
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)
) ;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18497779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档