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

Verifique se existem valores antes de INSERT INTO ... ON DUPLICATE KEY UPDATE


Em vez de review_autosave_data você pode criar duas tabelas como review_insert_drafts e review_update_drafts (um para novas revisões e outro para atualizações de revisão).
CREATE TABLE `review_insert_drafts` (
  `product_id` int(11) unsigned NOT NULL,
  `user_id` int(11) unsigned NOT NULL,
  `review` blob,
  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`product_id`, `user_id`),
  CONSTRAINT FOREIGN KEY (`product_id`) REFERENCES `products` (`id`),
  CONSTRAINT FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
);

CREATE TABLE `review_update_drafts` (
  `review_id` int(11) unsigned NOT NULL,
  `review` blob,
  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`review_id`),
  CONSTRAINT FOREIGN KEY (`review_id`) REFERENCES `reviews` (`id`)
);

(Não tenho certeza do que o name coluna é bom para.)

Em seu aplicativo, você deve verificar se o usuário está escrevendo uma nova avaliação ou atualizando uma existente.

Para novas revisões, você executa:
INSERT INTO review_insert_drafts (product_id, user_id, review)
VALUES (50, 1, "lorem ipsum")
ON DUPLICATE KEY
UPDATE review = "lorem ipsum";

ou
REPLACE INTO review_insert_drafts (product_id, user_id, review)
VALUES (50, 1, "lorem ipsum");

Para atualizações de revisão, você executa:
INSERT INTO review_update_drafts (review_id, review)
VALUES (25, "lorem ipsum")
ON DUPLICATE KEY
UPDATE review = "lorem ipsum";

ou
REPLACE INTO review_update_drafts (review_id, review)
VALUES (25, "lorem ipsum");

Vantagens:Você tem um design claro com chaves exclusivas claras e chaves estrangeiras.

Desvantagens:Você tem duas tabelas contendo dados semelhantes. Então você tem duas instruções de inserção diferentes. E você precisará de uma instrução UNION se quiser combinar as duas tabelas (por exemplo, mostrar todos os rascunhos para um usuário).