Ř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_INCREMENTvede 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 :-
