Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Einzigartige Beschränkungen und Einfügen oder Aktualisieren für MySQL und SQLite

SQLite-Lösung (dasselbe Prinzip sollte in mysql gelten)

Sie könnten einfach einen UNIQUE-Index hinzufügen (zumindest für SQLite, für das dies gilt), sodass Sie Folgendes haben könnten:-

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`); //<<<<<<<<<<
  • Beachten Sie AUTO_INCREMENT führt zu einem Fehler für SQLite, da es kein Schlüsselwort ist, das richtige Schlüsselwort in SQlite ist AUTOINCREMENT . Es wurde jedoch weggelassen, da es wahrscheinlich nicht als INTEGER PRIMARY KEY (oder implizit durch Angabe von PRIMARY KEY (id) erforderlich ist ) führt dazu, dass automatisch eine eindeutige ID generiert wird, wenn beim Einfügen kein Wert für die Spalte angegeben wird.

  • SQLite erfordert INTEGER, nicht INT, für die automatisch generierte ID. NOT NULL und auch UNIQUE sind impliziert, also müssen sie nicht angegeben werden.

Hier sind zwei Sätze von Beispiel-Einfügungen, die jeweils die UUID/Datum-Kombination duplizieren und somit aktualisieren, anstatt einzufügen, und auch mit derselben UUID, aber unterschiedlichem Datum einfügen und umgekehrt:-

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`;

Ergebnisse sind:-