1

Java DB で制約を作成しようとしています。タスクとサブタスクの 2 つのテーブルがあります。これらのテーブルには 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で制約を表現するにはどうすればよいですか? どんな助けでも大歓迎です。

4

1 に答える 1

1

Derby については触れませんが、ほとんどの DBMS (問題のある Access を除く) は、制約内のサブクエリ、または複数のテーブルを含む制約CHECK(同様の概念)をサポートしています (Firebird のドキュメントでは、これらをサポートしていると述べています)。ASSERTIONs

この素晴らしい回答に含まれる問題についての詳細を読むことができます: Why don't DBMS's support ASSERTION


制約を宣言的に適用する 1 つの方法は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 に答える