sql >> Databasteknik >  >> RDS >> Mysql

Unika begränsningar och infoga eller uppdatera för både MySQL och SQLite

SQLite-lösning (samma princip bör gälla i mysql)

Du kan helt enkelt lägga till ett UNIKT index (åtminstone för SQLite som detta är till för) så att du kan ha :-

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`); //<<<<<<<<<<
  • Notera AUTO_INCREMENT resulterar i ett misslyckande för SQLite eftersom det inte är ett nyckelord, det korrekta nyckelordet i SQLite är AUTOINCREMENT . Den har dock utelämnats eftersom den förmodligen inte krävs som INTEGER PRIMARY KEY (eller implicit genom att specificera PRIMARY KEY (id) ) kommer att resultera i att ett unikt id genereras automatiskt om inget värde anges för kolumnen vid infogning.

  • SQLite kräver INTEGER, inte INT, för det automatiskt genererade ID:t. NOT NULL och även UNIQUE är underförstådda så du behöver inte specificera dem.

Här är två uppsättningar exempel infogar som var och en duplicerar kombinationen uuid/datum och uppdaterar alltså istället för att infoga och infogar även med samma uuid men olika datum och 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`;

Resultaten är:-



  1. Kontrollera statusen för databasens e-postköer i SQL Server (T-SQL)

  2. Skapa en databas med MySQL Workbench från befintligt schema/modell

  3. sails-mysql:ER_NO_DB_ERROR:Ingen databas har valts

  4. SQL Server loop - hur går jag igenom en uppsättning poster