2009-04-21 10 views
0

私が知る限り、SQLite 3には外部キーの制約がありません。これには多対多のテーブルが必要です。外部キー制約に違反したときにABORTを発生させるトリガーを作成します。sqlite3上の複数のキーにトリガーを作成するには

CREATE TRIGGER fkFooBar 
    BEFORE INSERT ON Foo_Bar 
    FOR EACH ROW BEGIN 
    SELECT RAISE (ABORT, 'Insert on Foo_Bar violates foreign key') 
    WHERE ((SELECT id as fId FROM FOO WHERE fId = NEW.fooId) IS NULL) || ((SELECT id as bId FROM BAR WHERE bId = NEW.barId) IS NULL); 
    END; 

しかし、存在しているbarIdで、この唯一の制約はなく、fooId:私の文は次のようになります。私は漠然とSQLに精通しており、以前はトリガーを扱っていないので、これについて少し迷っています。なぜこれは機能しませんか?私はこれについて間違った方法をとっていますか?これははるかに簡単なはずですか? (つまり、1つのSELECT文で)

答えて

0

|| sqliteではバイナリORではありません。ただ一つの|

0

ヒントを受け取ります。

トリガーは通常悪い考えです。あなたはトリガーがしばしば間違っているもう一つの理由を明らかにしました。

主な理由は、トリガーがプログラミングを2つの部分に分割するからです。コードであり、簡単に見つけて維持することができるコードと、データベースに隠されており、見つけて維持するのがはるかに難しいコードです。

本当に難しい場合は間違ったツールを使用しています。誰もが実際に私が求めていた質問に答えていないので

+0

右ツールは何ですか? –

+0

コード。平凡な古いコード。あなたのアプリケーションはどの言語で書かれていますか?その言語を使用します。オブジェクト・リレーショナル・マッピング(ORM)層を使用している場合は、データベースではなく「トリガー」コードが入ります。 –

関連する問題