Rozwiązanie SQLite (ta sama zasada powinna obowiązywać w mysql)
Możesz po prostu dodać UNIKALNY indeks (przynajmniej dla SQLite, dla którego to jest), aby mieć :-
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`); //<<<<<<<<<<
-
Uwaga
AUTO_INCREMENT
powoduje awarię SQLite, ponieważ nie jest to słowo kluczowe, prawidłowe słowo kluczowe w SQLite toAUTOINCREMENT
. Jednak został pominięty, ponieważ prawdopodobnie nie jest wymagany jako INTEGER PRIMARY KEY (lub niejawny przez określeniePRIMARY KEY (id)
) spowoduje automatyczne wygenerowanie unikalnego identyfikatora, jeśli podczas wstawiania nie zostanie podana żadna wartość dla kolumny. -
SQLite wymaga INTEGER, a nie INT, dla automatycznie generowanego identyfikatora. Domniemane są wartości NOT NULL i UNIQUE, więc nie ma potrzeby ich określania.
Oto dwa zestawy przykładowych wstawek, z których każdy powiela kombinację identyfikatora uuid/data, w ten sposób aktualizując zamiast wstawiania, a także wstawiając z tym samym identyfikatorem uuid, ale inną datą i na odwrót :-
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`;
Wyniki to :-