sql >> Databasteknik >  >> RDS >> Mysql

mysql REPLACE-fråga med flera primärnycklar

Det borde inte göra någon skillnad, det är samma syntax. Se bara till att du har båda nycklarna angivna som kolumner. Till exempel:

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

REDIGERA

Här är mitt test som jag körde i min testdatabas för att se till att jag inte var på väg att förstöra din data. Självklart uppmuntrar jag dig att prova om du är osäker!

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

Detta är mitt resultat:

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

ANN REDIGERING

Jag tror att jag ser vad du pratar om i dokumentationen, förvirringen över unika kolumner:

Det syftar på en ganska konstruerad omständighet där raden du ersätter med inte bara konflikter med en befintlig primärnyckel, utan också med andra unika kolumner. Här är ett annat exempel för att illustrera denna punkt:

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

Lägg märke till hur den senaste REPLACE-operationen inte bara kommer i konflikt med (key1 , key2 ) primärnyckel, för den första REPLACE, men också med den unika färgen för den andra. I det här fallet raderas BÅDA raderna innan den sista REPLACE-operationen utförs så att resultatet inte blir någon konflikt. Du kommer att sluta med bara två rader:

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

Både raden med (key1 , key2 ) lika med ('widgets', 14) OCH raden med färgen "gul" blåstes bort på grund av att den nya raden stod i konflikt med flera unika begränsningar på bordet.

Hoppas detta hjälper!




  1. Bästa sättet att validera användarinmatning JDBC?

  2. Två främmande nycklar istället för primära

  3. WinDeath på notifyDataSetChanged()

  4. Möjliga konsekvenser av att öka varchar-längden i MySql?