Mysql
 sql >> Database >  >> RDS >> Mysql

Vincoli unici e inserimenti o aggiornamenti sia per MySQL che SQLite

Soluzione SQLite (lo stesso principio dovrebbe essere applicato in MySQL)

Potresti semplicemente aggiungere un indice UNICO (almeno per SQLite per il quale questo è per) così potresti avere :-

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 provoca un errore per SQLite poiché non è una parola chiave, la parola chiave corretta in SQlite è AUTOINCREMENT . Tuttavia, è stato omesso in quanto probabilmente non è richiesto come INTEGER PRIMARY KEY (o implicito specificando PRIMARY KEY (id) ) comporterà la generazione automatica di un ID univoco se non viene fornito alcun valore per la colonna durante l'inserimento.

  • SQLite richiede INTEGER, non INT, per l'ID generato automaticamente. NOT NULL e anche UNIQUE sono impliciti, quindi non è necessario specificarli.

Ecco due serie di inserti di esempio, ciascuno dei quali duplica la combinazione uuid/data aggiornando così invece di inserire e anche inserendo con lo stesso uuid ma data diversa e 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`;

I risultati sono :-