2016-11-06 6 views
0

EDIT:すべての接続時に外部キーを有効にする必要がありました。 SQLiteCommand command = new SQLiteCommand("PRAGMA foreign_keys = ON"SQLite - WHERE NOT EXISTSステートメントで関係のない複数の値を使用する

は、私はすべての上に見て、私の質問にアナログを見ていないので、そこにある場合の答えは、ちょうどその方向に私を指すと私は...私がしようとしています

を上移動します別のテーブルの値を格納する2つの他のテーブル間の関係であるテーブルを作成します。

ているのは、テーブルのための文を作成しましょう:

CREATE TABLE First (FirstID Integer PRIMARY KEY, Name Text, otherThing Text) 

CREATE TABLE Second (SecondID Text PRIMARY KEY, OtherStuff VarChar(10)) 

CREATE TABLE Third (FirstID Integer, SecondID Text, SomeData Text, 
    FOREIGN KEY (FirstID) REFERENCES First(FirstID), 
    FOREIGN KEY (SecondID) REFERENCES Second(SecondID), 
    PRIMARY KEY (FirstID, SecondID)) 

私が何をしたいのかがFirstIDはまず中に存在し、SecondIDが存在する場合にのみ、サードへの挿入を可能にINSERT文を作成することです2番目に

私は何を試すことができますか?私が試した(失敗した)構文は次のとおりです。

INSERT INTO Third (FirstID, SecondID, SomeData) SELECT 123, "foo", "Interesting Data Here" WHERE EXISTS (SELECT FirstID FROM First AND SELECT SecondID FROM Second) 

INSERT INTO Third (FirstID, SecondID, SomeData) SELECT 123, "foo", "Interesting Data Here" WHERE EXISTS (SELECT FirstID FROM First) AND WHERE EXISTS(SELECT SecondID FROM Second) 

答えて

0

外部キー制約によって無効なIDがすでに禁止されています。

しかし、存在しないIDを持つ行をサイレントに無視する場合は、手動でチェックする必要があります。 あなたの2番目のクエリは正しいですが、それは持っていないことができ、複数のWHERE句:

INSERT INTO Third (FirstID, SecondID, SomeData) 
SELECT 123, 'foo', 'Interesting Data Here' 
WHERE EXISTS (SELECT 1 FROM First WHERE FirstID = 123) 
    AND EXISTS (SELECT 1 FROM Second WHERE SecondID = 'foo'); 
+0

外部キー制約は、私はそれが思ったように、他のテーブルではありませんでしたエントリを禁止されていません。私はあなたのことを試し、それが私の所在を見る – Fiend394

+0

あなたは[それらを有効にしていません](http://stackoverflow.com/questions/9937713/does-sqlite3-not-support-foreign-key-constraints/9937992#9937992) 。 –

+0

少しの検索の後、私は答えを見つけました。ありがとう。すべての接続時に外部キーを有効にしなければならないかどうかはわかりませんでした。 SQLiteCommandコマンド=新しいSQLiteCommand( "PRAGMA foreign_keys = ON" ....など) 私はかなり混乱しました。 – Fiend394

関連する問題