sql >> Databáze >  >> RDS >> Mysql

mysql REPLACE dotaz s více primárními klíči

Nemělo by to dělat rozdíl, je to stejná syntaxe. Ujistěte se, že máte oba klíče zadané jako sloupce. Například:

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

UPRAVIT

Zde je můj test, který jsem provedl ve své testovací databázi, abych se ujistil, že nehodlám zničit vaše data. Samozřejmě vám doporučuji, abyste to vyzkoušeli, pokud si nejste jisti!

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

Toto je můj výsledek:

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

DALŠÍ ÚPRAVA

Myslím, že v dokumentaci chápu, o čem mluvíte, zmatek ohledně jedinečných sloupců:

To odkazuje na poněkud vykonstruovanou okolnost, ve které je řádek, který nahrazujete, v konfliktu nejen s existujícím primárním klíčem, ale také s jinými jedinečnými sloupci. Zde je další příklad pro ilustraci tohoto bodu:

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

Všimněte si, jak je poslední operace REPLACE nejen v konfliktu s (key1 , key2 ) primární klíč, prvního REPLACE, ale také s jedinečnou barvou druhého. V tomto případě jsou OBA řádky odstraněny před provedením poslední operace REPLACE, takže výsledkem není žádný konflikt. Skončíte pouze se dvěma řádky:

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

Oba řádky s (key1 , key2 ) rovno ('widgety', 14) A řádek se „žlutou“ barvou byl vyhozen, protože nový řádek byl v konfliktu s několika jedinečnými omezeními v tabulce.

Doufám, že to pomůže!




  1. Spojte dvě tabulky se všemi záznamy

  2. Pole PHP na pole Postgres

  3. Mapujte bodové pole geometrie PostGIS pomocí Hibernate na Spring Boot

  4. Nelze vložit pole do databáze