Solución SQLite (el mismo principio debería aplicarse en mysql)
Simplemente puede agregar un índice ÚNICO (al menos para SQLite para el cual es esto) para que pueda tener:-
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`); //<<<<<<<<<<
-
Nota
AUTO_INCREMENTda como resultado una falla para SQLite ya que no es una palabra clave, la palabra clave correcta en SQlite esAUTOINCREMENT. Sin embargo, se ha omitido porque probablemente no se requiera como INTEGER PRIMARY KEY (o implícito al especificarPRIMARY KEY (id)) dará como resultado que se genere automáticamente una identificación única si no se proporciona ningún valor para la columna al insertar. -
SQLite requiere INTEGER, no INT, para la identificación generada automáticamente. NOT NULL y también UNIQUE están implícitos, por lo que no es necesario especificarlos.
Aquí hay dos conjuntos de inserciones de ejemplo, cada una de las cuales duplica la combinación de uuid/fecha, por lo que se actualiza en lugar de insertar y también se inserta con el mismo uuid pero con una fecha diferente y viceversa:-
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`;
Los resultados son:-
