sql >> Databáze >  >> RDS >> Mysql

Jedinečná omezení a vložení nebo aktualizace pro MySQL i SQLite

Řešení SQLite (stejný princip by měl platit v mysql)

Můžete jednoduše přidat UNIKÁTNÍ index (alespoň pro SQLite, pro který je to určeno), abyste mohli mít :-

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`); //<<<<<<<<<<
  • Poznámka:AUTO_INCREMENT vede k selhání pro SQLite, protože to není klíčové slovo, správné klíčové slovo v SQlite je AUTOINCREMENT . Byl však vynechán, protože pravděpodobně není vyžadován jako PRIMÁRNÍ KLÍČ INTEGER (nebo implicitní zadáním PRIMARY KEY (id) ) bude mít za následek automatické vygenerování jedinečného id, pokud pro sloupec není při vkládání zadána žádná hodnota.

  • SQLite vyžaduje INTEGER, nikoli INT, pro automaticky generované id. NOT NULL a také UNIQUE jsou implicitní, takže je není třeba specifikovat.

Zde jsou dvě sady příkladů vložení, z nichž každá duplikuje kombinaci uuid/datum, čímž se aktualizuje místo vkládání a také vkládání se stejným uuid, ale jiným datem a naopak :-

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

Výsledky jsou :-



  1. Vyloučit záznamy, pokud se pravá tabulka shoduje

  2. Jak zrychlit váš SQL Server pomocí sledování výkonu databáze

  3. Robustnější kolace s podporou ICU v PostgreSQL 10

  4. Získávání výsledků mezi dvěma daty v PostgreSQL