Mysql
 sql >> Base de données >  >> RDS >> Mysql

Vérifiez si des valeurs existent avant INSERT INTO ... ON DUPLICATE KEY UPDATE

Au lieu de review_autosave_data vous pouvez créer deux tableaux comme review_insert_drafts et review_update_drafts (un pour les nouveaux avis et un pour les mises à jour d'avis).

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

(Vous ne savez pas quel est le name colonne est bonne pour.)

Dans votre application, vous devez vérifier si l'utilisateur rédige un nouvel avis ou met à jour un avis existant.

Pour les nouveaux avis que vous exécutez :

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");

Pour les mises à jour de révision que vous exécutez :

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");

Avantages :Vous disposez d'une conception claire avec des clés uniques et des clés étrangères claires.

Inconvénients :Vous avez deux tables contenant des données similaires. Vous avez donc deux instructions d'insertion différentes. Et vous aurez besoin d'une déclaration UNION si vous souhaitez combiner les deux tables (par exemple, afficher tous les brouillons pour un utilisateur).