Mysql
 sql >> Base de données >  >> RDS >> Mysql

Contraintes uniques et insertion ou mise à jour pour MySQL et SQLite

Solution SQLite (le même principe devrait s'appliquer dans mysql)

Vous pouvez simplement ajouter un index UNIQUE (au moins pour SQLite pour lequel c'est pour) afin que vous puissiez avoir :-

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`); //<<<<<<<<<<
  • Remarque AUTO_INCREMENT entraîne un échec pour SQLite car ce n'est pas un mot clé, le mot clé correct dans SQLite est AUTOINCREMENT . Cependant, il a été omis car il n'est probablement pas requis en tant que INTEGER PRIMARY KEY (ou l'implicite en spécifiant PRIMARY KEY (id) ) entraînera la génération automatique d'un identifiant unique si aucune valeur n'est fournie pour la colonne lors de l'insertion.

  • SQLite requiert INTEGER, et non INT, pour l'identifiant généré automatiquement. NOT NULL et également UNIQUE sont implicites, il n'est donc pas nécessaire de les spécifier.

Voici deux ensembles d'exemples d'inserts dupliquant chacun la combinaison uuid/date, mettant ainsi à jour au lieu d'insérer et insérant également avec le même uuid mais une date différente et 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`;

Les résultats sont :-