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

mysql REPLACE consulta con múltiples claves primarias

No debería hacer una diferencia, es la misma sintaxis. Solo asegúrese de tener ambas claves especificadas como columnas. Por ejemplo:

REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` /* , ... */ )
  VALUES ( 'widgets', 14, 'Blue widget with purple trim' );

EDITAR

Aquí está mi prueba que ejecuté en mi base de datos de prueba para asegurarme de que no estaba a punto de destruir sus datos. ¡Por supuesto, te animo a que lo pruebes si no estás seguro!

CREATE SCHEMA `my_testdb`;
USE `my_testdb`;
CREATE TABLE `my_table` (
  `key1` VARCHAR(20) NOT NULL,
  `key2` INTEGER NOT NULL,
  `othercolumn1` VARCHAR(50),
  CONSTRAINT PRIMARY KEY (`key1`, `key2`) );
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
  VALUES ( 'widgets', 14, 'Green widget with fuchsia trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
  VALUES ( 'widgets', 15, 'Yellow widget with orange trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
  VALUES ( 'thingamabobs', 14, 'Red widget with brown trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` )
  VALUES ( 'widgets', 14, 'Blue widget with purple trim' );
SELECT * FROM `my_table`;

Este es mi resultado:

key1          key2  othercolumn1
widgets       14    Blue widget with purple trim
widgets       15    Yellow widget with orange trim
thingamabobs  14    Red widget with brown trim

OTRA EDICIÓN

Creo que veo de lo que estás hablando en la documentación, la confusión sobre las columnas únicas:

Eso se refiere a una circunstancia bastante artificial en la que la fila que está reemplazando entra en conflicto no solo con una clave principal existente, sino también con otras columnas únicas. Aquí hay otro ejemplo para ilustrar este punto:

CREATE SCHEMA `my_testdb2`;
USE `my_testdb2`;
CREATE TABLE `my_table` (
  `key1` VARCHAR(20) NOT NULL,
  `key2` INTEGER NOT NULL,
  `color` VARCHAR(20) NOT NULL UNIQUE,
  `othercolumn1` VARCHAR(50),
  CONSTRAINT PRIMARY KEY (`key1`, `key2`) );
REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
  VALUES ( 'widgets', 14, 'green', 'Green widget with fuchsia trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
  VALUES ( 'widgets', 15, 'yellow', 'Yellow widget with orange trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
  VALUES ( 'thingamabobs', 14, 'red', 'Red widget with brown trim' );
REPLACE INTO `my_table` ( `key1`, `key2`, `color`, `othercolumn1` )
  VALUES ( 'widgets', 14, 'yellow', 'Yellow widget with purple trim' );
SELECT * FROM `my_table`;

Observe cómo la última operación REEMPLAZAR no solo entra en conflicto con (key1 , key2 ) llave primaria, del primer REPLACE, pero también con el color único del segundo. En este caso, AMBAS filas se eliminan antes de que se realice la última operación de REEMPLAZO para que el resultado no sea un conflicto. Terminarás con solo dos filas:

key1          key2  color   othercolumn1
widgets       14    yellow  Yellow widget with purple trim
thingamabobs  14    red     Red widget with brown trim

Tanto la fila con (key1 , key2 ) igual a ('widgets', 14) Y la fila con el color 'amarillo' quedó arrasada debido a que la nueva fila entraba en conflicto con múltiples restricciones únicas en la tabla.

¡Espero que esto ayude!