And*_*ndy 7 sqlite insert duplication
我有一张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
Run Code Online (Sandbox Code Playgroud)
我正在动态构建我的 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+"')"
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果(为了可读性而格式化):
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'
)
Run Code Online (Sandbox Code Playgroud)
这是应该怎么做?如果 Tina 已经在表中且开始日为 01/10/2017,则不应插入。
您可以使用唯一约束 & 来做到这一点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>
Run Code Online (Sandbox Code Playgroud)
在name
和上添加唯一约束start
:
sqlite> create unique index PaymentInformation_name_start on PaymentInformation ( name, start ) ;
Run Code Online (Sandbox Code Playgroud)
添加一行:
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>
Run Code Online (Sandbox Code Playgroud)
添加具有相同名称和开始日期的另一行,它会被忽略:
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>
Run Code Online (Sandbox Code Playgroud)