sql >> Base de Datos >  >> RDS >> Mysql

Restricciones únicas e inserción o actualización para MySQL y SQLite

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_INCREMENT da como resultado una falla para SQLite ya que no es una palabra clave, la palabra clave correcta en SQlite es AUTOINCREMENT . Sin embargo, se ha omitido porque probablemente no se requiera como INTEGER PRIMARY KEY (o implícito al especificar PRIMARY 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:-