Mysql
 sql >> база данни >  >> RDS >> Mysql

Уникални ограничения и вмъкване или актуализиране както за MySQL, така и за SQLite

SQLite решение (същият принцип трябва да се прилага и в mysql)

Можете просто да добавите УНИКАЛЕН индекс (поне за SQLite, за който това е), за да имате :-

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`); //<<<<<<<<<<
  • Забележка AUTO_INCREMENT води до неуспех за SQLite, тъй като това не е ключова дума, правилната ключова дума в SQlite е AUTOINCREMENT . Той обаче е пропуснат, тъй като вероятно не се изисква като ЦЕЛ ПЪРВИЧЕН КЛЮЧ (или имплицитно чрез посочване на PRIMARY KEY (id) ) ще доведе до автоматично генериране на уникален идентификатор, ако не е предоставена стойност за колоната при вмъкване.

  • SQLite изисква INTEGER, а не INT, за автоматично генерирания идентификатор. NOT NULL и също така UNIQUE се подразбират, така че няма нужда да ги посочвате.

Ето два набора примерни вмъквания, всяка от които дублира комбинацията uuid/date, като по този начин се актуализира вместо вмъкване и също така се вмъква със същия uuid, но различна дата и обратно:-

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

Резултатите са:-



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Заявка връща един допълнителен запис. Някакъв съвет как да го премахнете от резултатите от заявката?

  2. Primefaces 5.0 диаграми - как да създавате динамично модели на диаграми и серии изцяло от стойности на базата данни

  3. Йерархични заявки в MySQL

  4. Ръководство за използване на Sphinx с PHP и MySQL

  5. Групиране по първа буква, по азбучен ред, най-добрият начин?