仅当记录不存在时如何插入记录?

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,则不应插入。

Phi*_*lᵀᴹ 5

您可以使用唯一约束 & 来做到这一点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)