sql >> Database >  >> RDS >> Mysql

mysql VERVANG query met meerdere primaire sleutels

Het zou geen verschil moeten maken, het is dezelfde syntaxis. Zorg er wel voor dat u beide sleutels als kolommen hebt opgegeven. Bijvoorbeeld:

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

BEWERKEN

Dit is mijn test die ik in mijn testdatabase heb uitgevoerd om er zeker van te zijn dat ik je gegevens niet zou vernietigen. Natuurlijk moedig ik je aan om het uit te proberen als je het niet zeker weet!

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

Dit is mijn resultaat:

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

EEN ANDERE BEWERKING

Ik denk dat ik begrijp waar je het over hebt in de documentatie, de verwarring over unieke kolommen:

Dat verwijst naar een nogal gekunstelde omstandigheid waarin de rij die u vervangt niet alleen in conflict is met een bestaande primaire sleutel, maar ook met andere unieke kolommen. Hier is nog een voorbeeld om dit punt te illustreren:

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

Merk op hoe de laatste REPLACE-bewerking niet alleen conflicteert met de (key1 , key2 ) primaire sleutel, van de eerste VERVANG, maar ook met de unieke kleur van de tweede. In dit geval worden BEIDE rijen verwijderd voordat de laatste REPLACE-bewerking wordt uitgevoerd, zodat het resultaat geen conflict is. Je krijgt uiteindelijk maar twee rijen:

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

Zowel de rij met (key1 , key2 ) gelijk aan ('widgets', 14) EN de rij met de kleur 'geel' werd weggeblazen omdat de nieuwe rij in strijd was met meerdere unieke beperkingen op de tafel.

Ik hoop dat dit helpt!




  1. Trucs voor continue verbetering van databasebewaking

  2. Mysql:DB converteren van lokale tijd naar UTC

  3. Wanneer u NetBeans gebruikt om PHP-scripts te debuggen om tabelrecords te wijzigen, verandert 'affected_rows' van 1 in -1

  4. Oracle SQL*Plus gebruiken