2011-10-23 9 views
1

この問題を解決する方法がわかります。SQLite:その1つのエントリが制約よりも小さいことを確認してください

私は、主キーとt1_int NOT NULLとしてt1_primを持つ2つのテーブル

表1(t1_prim、t1_int) を得ました。 t2_prim1とt2_prim2と

表2(t2_prim1t2prim2、t2_int) は、主キーと外部キー制約t2_prim1参照はt1_primとして。

t1_intの対応するエントリよりも大きいt2_intに整数を入力しないようにするにはどうすればよいでしょうか?

私はこれ(あなたがチェック制約でサブクエリを入力することはできませんので、動作しない)ようにそれを試してみました:

CREATE TABLE table2 
    (t2_prim1 TEXT, 
    t2_prim2 INTEGER, 
    t2_int INTEGER NOT NULL, 
    PRIMARY KEY (t2_prim1, t2_prim2), 
    FOREIGN KEY (t2_prim1) REFERENCES table1(t1_prim), 
    CHECK (t2_int2 <= (SELECT t1_int2 FROM table1 WHERE t1_int1=t2_int1))); 

そして、私はそれがこのように動作するかどう別の問題があるだろうと思います。 t1_intの変更時にこの制約がまだ満たされていることを確認するにはどうすればよいですか?

答えて

2

最後に私の質問に対する答えが見つかりました。トリガーを使用して問題を解決できます。

TABLE1

t1_prim  t1_int 
---------- ---------- 
one   5   
two   10 

:あなたは今、次の表を使用している場合は

CREATE TRIGGER t1_int_update_constraint 
BEFORE UPDATE OF t1_int ON table1 
    BEGIN 
    SELECT CASE 
     WHEN new.t1_int < (SELECT max(t2_int) FROM table2 WHERE t2_prim1=old.t1_prim) 
     THEN (SELECT RAISE(ABORT, 
      'Input smaller than maximum of all values for t2_int in database!')) 
     END; 
    END; 

CREATE TRIGGER t2_int_update_constraint 
BEFORE UPDATE OF t2_int ON table2 
    BEGIN 
    SELECT CASE 
     WHEN new.t2_int > (SELECT t1_int FROM table1 WHERE t1_prim=old.t2_prim1) 
     THEN (SELECT RAISE(ABORT, 
     'Input bigger than value in t1_int!')) 
     END; 
    END; 

CREATE TRIGGER t2_int_insert_constraint 
BEFORE INSERT ON table2 
    BEGIN 
    SELECT CASE 
     WHEN new.t2_int > (SELECT t1_int FROM table1 WHERE t1_prim=new.t2_prim1) 
     THEN (SELECT RAISE(ABORT, 
     'Input bigger than value in t1_int!')) 
     END; 
    END; 

を:

CREATE TABLE table1 
    (t1_prim TEXT PRIMARY KEY, 
    t1_int INTEGER NOT NULL); 

CREATE TABLE table2 
    (t2_prim1 TEXT, 
    t2_prim2 INTEGER, 
    t2_int INTEGER NOT NULL, 
    PRIMARY KEY (t2_prim1, t2_prim2), 
    FOREIGN KEY (t2_prim1) REFERENCES table1(t1_prim)); 

更新や挿入するためのトリガーを作成:ここで働い例ですテーブル2

t2_prim1 t2_prim2 t2_int  
---------- ---------- ---------- 
one   1   5   
one   2   4   
two   1   7   
two   2   5   
two   3   1   

あなたはこの出力を得る:

UPDATE table1 SET t1_int=4 WHERE t1_prim='one'; 

エラー:データベース内t2_intのすべての値の最大値よりも小さい入力!

UPDATE table1 SET t1_int=6 WHERE t1_prim='two'; 

エラー:データベースのt2_intのすべての値の最大値よりも小さい値を入力してください!

UPDATE table2 SET t2_int=8 WHERE t2_prim1='one' AND t2_prim2=1; 

エラー:t1_intの値より大きい値を入力してください!

UPDATE table2 SET t2_int=11 WHERE t2_prim1='two' AND t2_prim2=2; 

エラー:t1_intの値より大きい値を入力してください!

INSERT INTO table2 VALUES ('one', 3, 6); 

エラー:t1_intの値より大きい値を入力してください!

ものは完璧にうまく機能している間:

INSERT INTO table2 VALUES ('one', 3, 6); 
UPDATE table2 SET t2_int=1 WHERE t2_prim1='one' AND t2_prim2=1; 
UPDATE table1 SET t1_int=8 WHERE t1_prim='two'; 
関連する問題