sql >> Database teknologi >  >> RDS >> Mysql

mysql REPLACE-forespørgsel med flere primære nøgler

Det burde ikke gøre en forskel, det er den samme syntaks. Bare vær sikker på at du har begge nøgler angivet som kolonner. For eksempel:

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

REDIGER

Her er min test, jeg kørte i min testdatabase for at sikre, at jeg ikke var ved at ødelægge dine data. Jeg opfordrer dig selvfølgelig til at prøve det, hvis du er i tvivl!

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

Dette er mit 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

END EN REDIGERING

Jeg tror, ​​jeg kan se, hvad du taler om i dokumentationen, forvirringen over unikke kolonner:

Det refererer til en ret konstrueret omstændighed, hvor den række, du erstatter, ikke kun er i konflikt med en eksisterende primærnøgle, men også med andre unikke kolonner. Her er endnu et eksempel til at illustrere dette 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`;

Bemærk, hvordan den sidste REPLACE-operation ikke kun er i konflikt med (key1 , key2 ) primær nøgle, af den første REPLACE, men også med den unikke farve af den anden. I dette tilfælde slettes BEGGE rækker, før den sidste REPLACE-operation udføres, så resultatet ikke er nogen konflikt. Du ender med kun to rækker:

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

Både rækken med (key1 , key2 ) lig med ('widgets', 14) AND rækken med farven 'gul' blev blæst væk på grund af den nye række, der var i konflikt med flere unikke begrænsninger på bordet.

Håber dette hjælper!




  1. Værdi returnerer når ingen rækker i PDO

  2. Sådan repareres en ødelagt SQL-visning

  3. Dvale optimistisk låsning..hvordan virker det?

  4. DateTime::CreateFromFormat til PHP 5.2.14