J'ai une table 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
Je crée ma requête SQL de manière dynamique, comme ceci:
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+"')"
Ce qui donne le résultat suivant (formaté pour la lisibilité):
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'
)
Est-ce ainsi que cela doit être fait? Il ne doit pas insérer si Tina est déjà dans le tableau avec un jour de début du 01/10/2017.
Vous pouvez le faire avec une contrainte unique & insert or ignore
.
Créer une table:
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>
Ajoutez une contrainte unique sur name
et start
:
sqlite> create unique index PaymentInformation_name_start on PaymentInformation ( name, start ) ;
Ajoutez une ligne:
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>
Ajoutez une autre ligne avec le même nom et la même date de début, et elle sera ignorée:
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>