web-dev-qa-db-ja.com

SQLiteでIF NOT EXISTSを実行する方法

この行をMS SQL ServerからSQLiteに移植しようとしています

IF NOT EXISTS(SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received') 
    INSERT INTO EVENTTYPE (EventTypeName) VALUES ('ANI Received');

SQLiteはIF NOT EXISTSをサポートしていないか、少なくとも機能しません。シンプルなものが欠けていますか?回避策はありますか?

76
AngryHacker

これはどう?

INSERT OR IGNORE INTO EVENTTYPE (EventTypeName) VALUES 'ANI Received'

(私はSQLiteを持っていないのでテストされていません...しかし このリンク は非常に記述的です。)

さらに、これも動作するはずです:

INSERT INTO EVENTTYPE (EventTypeName)
SELECT 'ANI Received'
WHERE NOT EXISTS (SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received');
113
beach

既存の値の挿入を無視する場合は、テーブルにキーフィールドが必要です。次のような主キーフィールドを持つテーブルを作成します。

CREATE TABLE IF NOT EXISTS TblUsers (UserId INTEGER PRIMARY KEY, UserName varchar(100), ContactName varchar(100),Password varchar(100));

次に、テーブルのクエリを挿入または置換/挿入または無視します:

INSERT OR REPLACE INTO TblUsers (UserId, UserName, ContactName ,Password) VALUES('1','UserName','ContactName','Password');

既存のプライマリキー値を再入力させません...これは、テーブルに値が存在するかどうかを確認する方法です。

10
TheDean

また、KEYフィールドを使用してテーブルに制約を設定し、競合時の「無視」を設定することもできます。

適用可能な制約違反が発生すると、IGNORE解決アルゴリズムは制約違反を含む1つの行をスキップし、何も問題がなかったかのようにSQLステートメントの後続の行の処理を続行します。制約違反を含む行の前後の他の行は、通常どおり挿入または更新されます。 IGNORE競合解決アルゴリズムが使用されている場合、エラーは返されません。

SQLiteドキュメント

1
Ilber