sql >> Base de Datos >  >> RDS >> Mysql

Compruebe si existen valores antes de INSERTAR EN... EN LA ACTUALIZACIÓN DE CLAVE DUPLICADA

En lugar de review_autosave_data puede crear dos tabels como review_insert_drafts y review_update_drafts (uno para revisiones nuevas y otro para actualizaciones de revisiones).

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

(No estoy seguro de cuál es el name la columna es buena para.)

En su aplicación, debe verificar si el usuario está escribiendo una nueva reseña o está actualizando una existente.

Para nuevas reseñas ejecuta:

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

Para las actualizaciones de revisión, ejecute:

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

Ventajas:tiene un diseño claro con claves únicas claras y claves externas.

Desventajas:Tienes dos tablas que contienen datos similares. Así que tienes dos declaraciones de inserción diferentes. Y necesitará una instrucción UNION si desea combinar las dos tablas (por ejemplo, mostrar todos los borradores de un usuario).