SQLite-lösning (samma princip bör gälla i mysql)
Du kan helt enkelt lägga till ett UNIKT index (åtminstone för SQLite som detta är till för) så att du kan ha :-
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`); //<<<<<<<<<<
-
Notera
AUTO_INCREMENT
resulterar i ett misslyckande för SQLite eftersom det inte är ett nyckelord, det korrekta nyckelordet i SQLite ärAUTOINCREMENT
. Den har dock utelämnats eftersom den förmodligen inte krävs som INTEGER PRIMARY KEY (eller implicit genom att specificeraPRIMARY KEY (id)
) kommer att resultera i att ett unikt id genereras automatiskt om inget värde anges för kolumnen vid infogning. -
SQLite kräver INTEGER, inte INT, för det automatiskt genererade ID:t. NOT NULL och även UNIQUE är underförstådda så du behöver inte specificera dem.
Här är två uppsättningar exempel infogar som var och en duplicerar kombinationen uuid/datum och uppdaterar alltså istället för att infoga och infogar även med samma uuid men olika datum och vice versa :-
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`;
Resultaten är:-