Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Restrições exclusivas e inserção ou atualização para MySQL e SQLite

Solução SQLite (mesmo princípio deve ser aplicado no mysql)


Você poderia simplesmente adicionar um índice UNIQUE (pelo menos para SQLite para o qual isso é) para que você pudesse ter:-
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`); //<<<<<<<<<<

  • Observe AUTO_INCREMENT resulta em uma falha para SQLite, pois não é uma palavra-chave, a palavra-chave correta no SQLite é AUTOINCREMENT . No entanto, foi omitido, pois provavelmente não é necessário como INTEGER PRIMARY KEY (ou o implícito, especificando PRIMARY KEY (id) ) resultará em um id único sendo gerado automaticamente se nenhum valor for fornecido para a coluna ao inserir.

  • SQLite requer INTEGER, não INT, para o id gerado automaticamente. NOT NULL e também UNIQUE estão implícitos, portanto, não há necessidade de especificá-los.

Aqui estão dois conjuntos de inserções de exemplo, cada uma duplicando a combinação uuid/data, atualizando assim em vez de inserir e também inserindo com o mesmo uuid, mas data diferente e 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`;

Os resultados são:-