Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

consulta mysql REPLACE com várias chaves primárias


Não deve fazer diferença, é a mesma sintaxe. Apenas certifique-se de ter ambas as chaves especificadas como colunas. Por exemplo:
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` /* , ... */ )
  VALUES ( 'widgets', 14, 'Blue widget with purple trim' );

EDITAR

Aqui está o meu teste que executei no meu banco de dados de teste para ter certeza de que não estava prestes a destruir seus dados. Claro, eu encorajo você a experimentá-lo se não tiver certeza!
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 é o meu 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

OUTRA EDIÇÃO

Acho que vejo o que você está falando na documentação, a confusão sobre colunas únicas:

Isso está se referindo a uma circunstância bastante artificial na qual a linha que você está substituindo entra em conflito não apenas com uma chave primária existente, mas também com outras colunas exclusivas. Aqui está outro exemplo para ilustrar este ponto:
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 como a última operação REPLACE não só entra em conflito com (key1 , key2 ) chave primária, da primeira REPLACE, mas também com a cor única da segunda. Nesse caso, BOTH linhas são excluídas antes que a última operação REPLACE seja executada para que o resultado não seja um conflito. Você terminará com apenas duas linhas:
key1          key2  color   othercolumn1
widgets       14    yellow  Yellow widget with purple trim
thingamabobs  14    red     Red widget with brown trim

Tanto a linha com (key1 , key2 ) igual a ('widgets', 14) E a linha com a cor 'amarelo' foi destruída devido à nova linha entrar em conflito com várias restrições exclusivas na tabela.

Espero que isto ajude!