Solução SQLite (mesmo princípio deve ser aplicado no mysql)
Você poderia simplesmente adicionar um índice UNIQUE (pelo menos para SQLite para o qual isso é) para que você pudesse ter:-
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`); //<<<<<<<<<<
-
ObserveAUTO_INCREMENT
resulta em uma falha para SQLite, pois não é uma palavra-chave, a palavra-chave correta no SQLite éAUTOINCREMENT
. No entanto, foi omitido, pois provavelmente não é necessário como INTEGER PRIMARY KEY (ou o implícito, especificandoPRIMARY KEY (id)
) resultará em um id único sendo gerado automaticamente se nenhum valor for fornecido para a coluna ao inserir.
-
SQLite requer INTEGER, não INT, para o id gerado automaticamente. NOT NULL e também UNIQUE estão implícitos, portanto, não há necessidade de especificá-los.
Aqui estão dois conjuntos de inserções de exemplo, cada uma duplicando a combinação uuid/data, atualizando assim em vez de inserir e também inserindo com o mesmo uuid, mas data diferente e 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`;
Os resultados são:-