Mysql
 sql >> Base de données >  >> RDS >> Mysql

requête mysql REPLACE avec plusieurs clés primaires

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 !