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

query mysql REPLACE con più chiavi primarie

Non dovrebbe fare la differenza, è la stessa sintassi. Assicurati solo di avere entrambe le chiavi specificate come colonne. Ad esempio:

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

MODIFICA

Ecco il mio test che ho eseguito nel mio database di test per assicurarmi di non distruggere i tuoi dati. Naturalmente, se non sei sicuro, ti incoraggio a provarlo!

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

Questo è il mio risultato:

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

UN'ALTRA MODIFICA

Penso di vedere di cosa stai parlando nella documentazione, la confusione sulle colonne univoche:

Questo si riferisce a una circostanza piuttosto artificiosa in cui la riga che stai sostituendo è in conflitto non solo con una chiave primaria esistente, ma anche con altre colonne univoche. Ecco un altro esempio per illustrare questo 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`;

Nota come l'ultima operazione REPLACE non è solo in conflitto con (key1 , key2 ) chiave primaria, della prima REPLACE, ma anche con il colore univoco della seconda. In questo caso, ENTRAMBE le righe vengono eliminate prima che venga eseguita l'ultima operazione REPLACE in modo che il risultato non sia un conflitto. Ti ritroverai con solo due righe:

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

Sia la riga con (key1 , key2 ) uguale a ('widget', 14) AND la riga con il colore "giallo" è stata spazzata via a causa del conflitto della nuova riga con più vincoli univoci sul tavolo.

Spero che questo aiuti!