Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql REPLACE-Abfrage mit mehreren Primärschlüsseln

Es sollte keinen Unterschied machen, es ist die gleiche Syntax. Stellen Sie nur sicher, dass Sie beide Schlüssel als Spalten angegeben haben. Zum Beispiel:

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

BEARBEITEN

Hier ist mein Test, den ich in meiner Testdatenbank durchgeführt habe, um sicherzustellen, dass ich Ihre Daten nicht zerstören wollte. Natürlich ermutige ich Sie, es auszuprobieren, wenn Sie sich nicht sicher sind!

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

Das ist mein Ergebnis:

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

WEITERE BEARBEITUNG

Ich glaube, ich sehe, wovon Sie in der Dokumentation sprechen, die Verwirrung über eindeutige Spalten:

Das bezieht sich auf einen ziemlich erfundenen Umstand, bei dem die Zeile, durch die Sie ersetzen, nicht nur mit einem vorhandenen Primärschlüssel, sondern auch mit anderen eindeutigen Spalten in Konflikt steht. Hier ist ein weiteres Beispiel, um diesen Punkt zu veranschaulichen:

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

Beachten Sie, dass die letzte REPLACE-Operation nicht nur mit der (key1 , key2 ) Primärschlüssel, des ersten REPLACE, aber auch mit der eindeutigen Farbe des zweiten. In diesem Fall werden BEIDE Zeilen gelöscht, bevor die letzte REPLACE-Operation ausgeführt wird, sodass das Ergebnis kein Konflikt ist. Am Ende haben Sie nur noch zwei Zeilen:

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

Sowohl die Zeile mit (key1 , key2 ) gleich ('widgets', 14) AND Die Zeile mit der Farbe „Gelb“ wurde weggeblasen, da die neue Zeile mit mehreren eindeutigen Einschränkungen in der Tabelle in Konflikt stand.

Hoffe, das hilft!