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!