Řešení SQLite (stejný princip by měl platit v mysql)
Můžete jednoduše přidat UNIKÁTNÍ index (alespoň pro SQLite, pro který je to určeno), abyste mohli mít :-
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`); //<<<<<<<<<<
-
Poznámka:
AUTO_INCREMENT
vede k selhání pro SQLite, protože to není klíčové slovo, správné klíčové slovo v SQlite jeAUTOINCREMENT
. Byl však vynechán, protože pravděpodobně není vyžadován jako PRIMÁRNÍ KLÍČ INTEGER (nebo implicitní zadánímPRIMARY KEY (id)
) bude mít za následek automatické vygenerování jedinečného id, pokud pro sloupec není při vkládání zadána žádná hodnota. -
SQLite vyžaduje INTEGER, nikoli INT, pro automaticky generované id. NOT NULL a také UNIQUE jsou implicitní, takže je není třeba specifikovat.
Zde jsou dvě sady příkladů vložení, z nichž každá duplikuje kombinaci uuid/datum, čímž se aktualizuje místo vkládání a také vkládání se stejným uuid, ale jiným datem a naopak :-
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`;
Výsledky jsou :-