2013-08-28 162 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