PaymentInformation
テーブルがあります
ID NAME Start End
1 Tina 1/7/2014 1/17/2014
2 Alice 3/7/2014 3/17/2014
3 John 5/7/2014 5/17/2014
4 Michelle 7/7/2014 7/17/2014
次のように、SQLクエリを動的に構築しています。
SQLiteDataBaseQueryHolder3 = "INSERT INTO " + SQLiteHelper.TABLE2_NAME + "(" +
"name, Start, End" +
")VALUES('" +
tempName + "'" +
",'" +start + "'" +
",'" + end + "" +
"')" +
" WHERE NOT EXISTS ( SELECT * FROM " +SQLiteHelper.TABLE2_NAME +" WHERE name = '"+
tempName+"' AND Start = '"+Start+"')"
次の結果が得られます(読みやすいようにフォーマットされています)。
INSERT INTO PaymentInformation(NAME, Start, End)
VALUES('Tina','01/10/2017','2/10/2017')
WHERE NOT EXISTS (
SELECT *
FROM PaymentInformation
WHERE name = 'Tina' AND duration_start = '01/10/2017'
)
これはどうすればいいですか? Tinaがすでに2017年10月1日の開始日でテーブルにある場合は、挿入しないでください。
これを行うには、一意の制約&insert or ignore
を使用します。
テーブルを作成します。
ironforge:tmp phil$ sqlite3
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> create table PaymentInformation
...> (
...> ID int,
...> name varchar(100),
...> start date,
...> end date );
sqlite>
name
とstart
に一意の制約を追加します。
sqlite> create unique index PaymentInformation_name_start on PaymentInformation ( name, start ) ;
行を追加します。
sqlite> insert or ignore into PaymentInformation values ( 1,'Phil','2017-01-01','2017-02-02' );
sqlite> select * from PaymentInformation;
1|Phil|2017-01-01|2017-02-02
sqlite>
同じ名前と開始日を持つ別の行を追加すると、無視されます。
sqlite> insert or ignore into PaymentInformation values ( 2,'Phil','2017-01-01','2017-02-02' );
sqlite> select * from PaymentInformation;
1|Phil|2017-01-01|2017-02-02
sqlite>