Mysql
 sql >> Database >  >> RDS >> Mysql

Verificare se esistono valori prima di INSERT INTO ... ON DUPLICATE KEY UPDATE

Invece di review_autosave_data puoi creare due tabelle come review_insert_drafts e review_update_drafts (uno per le nuove recensioni e uno per gli aggiornamenti delle recensioni).

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

(Non sono sicuro di quale sia il name la colonna va bene per.)

Nella tua applicazione devi controllare se l'utente sta scrivendo una nuova recensione o ne sta aggiornando una esistente.

Per le nuove recensioni esegui:

INSERT INTO review_insert_drafts (product_id, user_id, review)
VALUES (50, 1, "lorem ipsum")
ON DUPLICATE KEY
UPDATE review = "lorem ipsum";

o

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

Per gli aggiornamenti delle recensioni che esegui:

INSERT INTO review_update_drafts (review_id, review)
VALUES (25, "lorem ipsum")
ON DUPLICATE KEY
UPDATE review = "lorem ipsum";

o

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

Vantaggi:hai un design chiaro con chiavi univoche chiare e chiavi esterne.

Svantaggi:hai due tabelle contenenti dati simili. Quindi hai due diverse istruzioni di inserimento. E avrai bisogno di una dichiarazione UNION se vuoi combinare le due tabelle (es. mostra tutte le bozze per un utente).