2011-07-12 10 views
5

modo comando Reemplazar de MySQL (que no debe confundirse con la cadena de reemplazar la función) sustituye a una fila si existe una columna con la misma clave primaria con los datos insertados ...reemplazarse mysql consulta con múltiples claves primarias

pero ¿Qué sucede si tengo dos claves principales y quiero usar ambas para especificar la fila para reemplazar no solo una de ellas ... cómo especifico que mysql use ambas claves en lugar de solo una

+1

Una tabla, por definición, solo puede tener una única PK. ¿Te refieres a llaves únicas? – Jason

+0

Estoy bastante seguro de que se refería a una clave primaria de múltiples columnas. –

+1

No puede tener dos claves principales. ¿Quiere decir que tiene una clave primaria compuesta? – Flimzy

Respuesta

5

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 me encontré en mi base de datos de prueba para asegurarse 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

Me parece ver lo que está hablando en la documentación, la confusión sobre columnas únicas:

Es posible que una sola fila reemplace más de una fila anterior si la tabla contiene múltiples índices únicos y la nueva fila duplica valores para diferentes filas antiguas en diferentes índices únicos. - Documentación de MySQL

que se está refiriendo a una circunstancia bastante artificiales en el que la fila que está reemplazando a los conflictos no sólo con una clave principal existente, pero 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`; 

Note como la última operación de sustitución no sólo los conflictos con la clave principal (key1, key2), de la primera REEMPLAZAR, sino también con el color único de la segunda. En este caso, AMBAS filas se eliminan antes de realizar la última operación REEMPLAZAR para que el resultado no sea conflictivo. Usted va a terminar con sólo 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' quedamos impresionados debido a la nueva fila en conflicto con múltiples restricciones únicas en la tabla.

Espero que esto ayude!

+2

es así de cierto ... la forma en que lo entiendo es que REEMPLAZAR reemplazará si CUALQUIERA de las teclas múltiples están duplicadas ... la forma en que quiero es que AMBAS de las claves estén duplicadas, no solo una de ellas. ... corregirme si estoy equivocado – pillarOfLight

+1

Sí, es cierto.Acabo de ejecutarlo en una base de datos de prueba que creé para asegurarme de que no estoy perdiendo el recuerdo, y solo reemplaza los valores en los que coinciden ambas columnas, ni/ni. En caso de duda, ¡dale un giro! –

+0

@ user841626: Así es como leo la documentación también. Sin embargo, puede que tenga que probarlo para ver cómo se comporta. – Flimzy

Cuestiones relacionadas