Soluzione SQLite (lo stesso principio dovrebbe essere applicato in MySQL)
Potresti semplicemente aggiungere un indice UNICO (almeno per SQLite per il quale questo è per) così potresti avere :-
DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (
`id` INTEGER, //<<<<<<<<<< See notes below
`uuid` VARCHAR ( 64 ) NOT NULL,
`name` VARCHAR ( 32 ) NOT NULL,
`date` BIGINT NULL,
PRIMARY KEY ( `id` )
);
CREATE UNIQUE INDEX IF NOT EXISTS uuid_date ON `users` (`uuid`,`date`); //<<<<<<<<<<
-
Nota
AUTO_INCREMENT
provoca un errore per SQLite poiché non è una parola chiave, la parola chiave corretta in SQlite èAUTOINCREMENT
. Tuttavia, è stato omesso in quanto probabilmente non è richiesto come INTEGER PRIMARY KEY (o implicito specificandoPRIMARY KEY (id)
) comporterà la generazione automatica di un ID univoco se non viene fornito alcun valore per la colonna durante l'inserimento. -
SQLite richiede INTEGER, non INT, per l'ID generato automaticamente. NOT NULL e anche UNIQUE sono impliciti, quindi non è necessario specificarli.
Ecco due serie di inserti di esempio, ciascuno dei quali duplica la combinazione uuid/data aggiornando così invece di inserire e anche inserendo con lo stesso uuid ma data diversa e viceversa :-
INSERT OR REPLACE INTO `users` VALUES(null,'Fred01234567','Fred Bloggs the 1st','20180101');
INSERT OR REPLACE INTO `users` VALUES(null,'Fred01234567','Fred Bloggs the 2nd','20180101'); -- <<<< DUPLICATE
INSERT OR REPLACE INTO `users` VALUES(null,'Fred99999999','Fred Bloggs the 2nd','20180101'); -- <<<< different uuid same date
INSERT OR REPLACE INTO `users` VALUES(null,'Fred01234567','Fred Bloggs the 2nd','99999999'); -- <<<< same uuid different date
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred76543210','Fred NotBloggs the 1st','20180202');
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred76543210','Fred NotBloggs the 1st','20180202');
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred99999999','Fred NotBloggs the 1st','20180202');
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred76543210','Fred NotBloggs the 1st','99999999');
SELECT * FROM `users`;
I risultati sono :-