SQLite решение (същият принцип трябва да се прилага и в mysql)
Можете просто да добавите УНИКАЛЕН индекс (поне за SQLite, за който това е), за да имате :-
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`); //<<<<<<<<<<
-
Забележка
AUTO_INCREMENT
води до неуспех за SQLite, тъй като това не е ключова дума, правилната ключова дума в SQlite еAUTOINCREMENT
. Той обаче е пропуснат, тъй като вероятно не се изисква като ЦЕЛ ПЪРВИЧЕН КЛЮЧ (или имплицитно чрез посочване наPRIMARY KEY (id)
) ще доведе до автоматично генериране на уникален идентификатор, ако не е предоставена стойност за колоната при вмъкване. -
SQLite изисква INTEGER, а не INT, за автоматично генерирания идентификатор. NOT NULL и също така UNIQUE се подразбират, така че няма нужда да ги посочвате.
Ето два набора примерни вмъквания, всяка от които дублира комбинацията uuid/date, като по този начин се актуализира вместо вмъкване и също така се вмъква със същия uuid, но различна дата и обратно:-
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`;
Резултатите са:-