Cela ne devrait pas faire de différence, c'est la même syntaxe. Assurez-vous simplement que les deux clés sont spécifiées en tant que colonnes. Par exemple :
REPLACE INTO `my_table` ( `key1`, `key2`, `othercolumn1` /* , ... */ )
VALUES ( 'widgets', 14, 'Blue widget with purple trim' );
MODIFIER
Voici mon test que j'ai exécuté dans ma base de données de test pour m'assurer que je n'étais pas sur le point de détruire vos données. Bien sûr, je vous encourage à l'essayer si vous n'êtes pas sûr !
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`;
Voici mon résultat :
key1 key2 othercolumn1
widgets 14 Blue widget with purple trim
widgets 15 Yellow widget with orange trim
thingamabobs 14 Red widget with brown trim
UNE AUTRE MODIFICATION
Je pense voir de quoi vous parlez dans la documentation, la confusion sur les colonnes uniques :
Cela fait référence à une circonstance plutôt artificielle dans laquelle la ligne que vous remplacez par entre en conflit non seulement avec une clé primaire existante, mais également avec d'autres colonnes uniques. Voici un autre exemple pour illustrer ce point :
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`;
Remarquez comment la dernière opération REPLACE n'est pas seulement en conflit avec le (key1
, key2
) clé primaire, du premier REPLACE, mais aussi avec la couleur unique du second. Dans ce cas, les DEUX lignes sont supprimées avant que la dernière opération REPLACE ne soit effectuée afin qu'il n'y ait pas de conflit. Vous vous retrouverez avec seulement deux lignes :
key1 key2 color othercolumn1
widgets 14 yellow Yellow widget with purple trim
thingamabobs 14 red Red widget with brown trim
La ligne avec (key1
, key2
) égal à ('widgets', 14) ET la ligne avec la couleur "jaune" a été supprimée en raison du conflit entre la nouvelle ligne et plusieurs contraintes uniques sur la table.
J'espère que cela vous aidera !