SQLiteに存在しない場合の方法


80

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

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

SQLiteはIFNOT EXISTSをサポートしていないか、少なくとも私はそれを機能させることができないようです。簡単なものが足りませんか?回避策はありますか?

回答:


120

これはどう?

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');

14
ありがとう。ただし、INSERT OR IGNOREピースは、EventTypeNameが一意に設定されている場合にのみ機能することに注意してください。
AngryHacker 2009

2
本当。サンプルSQLでの使用方法を考えると、これは一意であると思いました。そうでない場合は、2番目の方法を使用する必要があります。
ビーチ

EventTypeNameが一意でない場合、2番目のメソッドを実際に使用できますか?同様のことをしようとしていますが、SELECT WHERE NOT EXISTS句が複数の行を返していることがわかりました。実際、()EventTypeName!= 'ANIReceived'に相当するすべての行がtrueです。
マイケル

EventTypeNameを一意にすることを目的としています。新しい値 'ANI Received'は、テーブルEVENTTYPEにまだ存在しない場合にのみ、テーブルEVENTTYPEに挿入されます。これがWHERENOTEXISTSの出番です。SELECTWHERENOTEXISTS句は単一の行のみを返すことができます。FROM句はありません-複数の行を返す方法はありません。これがそれをクリアすることを願っています。
ビーチ

1
これは非常に悪いコーディングスタイルです。エラーが発生するたびに、クエリはサイレントに失敗します。ドキュメントから:IGNORE該当する制約違反が発生すると、IGNORE解決アルゴリズムは、制約違反を含む1行をスキップし、何も問題がなかったかのようにSQLステートメントの後続の行の処理を続行します。制約違反を含む行の前後の他の行は、正常に挿入または更新されます。IGNORE競合解決アルゴリズムが使用されている場合、エラーは返されません。
ManuelSchneid3r 2015年

12

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

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');

既存の主キー値を再入力することはできません...これは、値がテーブルに存在するかどうかを確認する方法です。


1

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

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

SQLiteドキュメント

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.