web-dev-qa-db-fra.com

Lors d'une mise à jour de clé en double - plusieurs colonnes

Lors de l'utilisation de insérer ... lors de la mise à jour des clés en double , quelle est la syntaxe pour mettre à jour plusieurs colonnes?

INSERT INTO table1 (col1, col2, col3, col4) VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’)
ON DUPLICATE KEY UPDATE col2=‘$val2’, col3=‘$val3’, col4=‘$val4’ // <-- not sure

Mise à jour: j'utilise ceci dans PHP. Puisqu'il s'agit d'une question de syntaxe, elle est très pertinente.

$result = mysql_query("INSERT INTO table1 (col1, col2, col3, col4) 
                         VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’)
                         ON DUPLICATE KEY UPDATE (col2=‘$val2’, col3=‘$val3’, col4=‘$val4’)")

Encore une fois, pas sûr de cette dernière partie avec la "mise à jour".

27
Lucy Weatherford
INSERT INTO table1
  (`col1`, `col2`, `col3`, `col4`)
VALUES
  ('val1', 'val2', 'val3', 'val4')
ON DUPLICATE KEY UPDATE
  `col2`='val2',
  `col3`='val3', [...]

J'ai corrigé vos citations et vos graduations.

Modifier:

En PHP:

$result = mysql_query("
     INSERT INTO table1
         (col1, col2, col3, col4)
     VALUES
         ('" . $val1 . "',  '" . $val2 . "', '" . $val3 . "', '" . $val4 . "')
     ON DUPLICATE KEY UPDATE
         col2='" . $val2 . "',
         col3='" . $val3 . "',
         col4='" . $val4 . "'"
 );

Notez que les valeurs sont entourées de guillemets simples '. Si les valeurs sont de type numérique (INT, FLOAT, etc.), vous pouvez supprimer ces guillemets. Les backticks sont facultatifs autour des noms de colonnes tant que vous n'utilisez pas de noms de colonnes comme count, type ou table.

Dans l'exemple PHP, la concaténation de chaînes est utilisée pour séparer clairement les variables.

33
sathia

Eh bien, c'est vieux. Mais bien sûr, vous n'avez qu'à fournir une valeur ne fois, il n'y a aucune raison de l'ajouter une deuxième fois dans la requête (ce qui est pratique pour plusieurs insertions ou déclarations préparées):

INSERT INTO table1
  (col1, col2, col3, col4)
VALUES
  ('val1', 'val2', 'val3', 'val4')
ON DUPLICATE KEY UPDATE
  col2=VALUES(col2),
  col3=VALUES(col3) [,...]

Ce qui a l'avantage de fonctionner pour une instruction d'insertion multiple:

INSERT INTO table1
  (col1, col2, col3, col4)
VALUES
  ('val1', 'val2', 'val3', 'val4'),
  ('val5', 'val6', 'val7', 'val8'),
  ('val9', 'val10', 'val11', 'val12')
ON DUPLICATE KEY UPDATE
  col2=VALUES(col2),
  col3=VALUES(col3) [,...]
26
Wrikken

Votre requête semble être correcte. Voici mon exemple de ce type de requête:

INSERT INTO Stat (id, month, year, views, redirects, onList, onMap, emails) VALUE ("' . $Id . '","' . $month . '","' . $year . '",0,0,"' . $data['onList'] . '","' . $data['onMap'] . '",0) ON DUPLICATE KEY UPDATE onList=onList+' . $data['onList'] . ', onMap=onMap+' . $data['onMap']
0
Wojciech Jasiński

Par souci de syntaxe claire, il existe une autre forme de syntaxe;

INSERT INTO `table1` SET `id`=$id,
                         `col2`='$col2',
                         `col3`='$col3'[, ...]
 ON DUPLICATE KEY UPDATE `col2`='$col2',
                         `col4`='$col4'[, ...]

Exemple;

INSERT INTO customers SET cid=10,
                          createdon=NOW(),
                          createdby='user',
                          cname='Steve'
  ON DUPLICATE KEY UPDATE modifiedon=NOW(),
                          modifiedby='user',
                          cname='Steve';

S'il n'existe pas de client avec ID = 10 dans la base de données, il sera créé et les colonnes cid, createdon, createdby, cname seront définies. S'il existe, il sera mis à jour et les colonnes modifiées sur, modifiedbym, cname seront mises à jour.

NOTE # 1: SI vous mettez pour la clé primaire cid = 0 ici, cela déclenchera AUTO_INCREMENT (bien sûr, si la colonne pk est définie comme AUTO_INCREMENT) et un enregistrement sera inséré!

REMARQUE # 2: ON DUPLICATE KEY UPDATE met à jour l'enregistrement PK ID existant. Mais il met également à jour si DUPLICATE est effectué sur n'importe quelle colonne UNIQUE KEY. Par exemple, si vous avez défini que la colonne cname est UNIQUE, l'enregistrement de l'enregistrement avec cname = 'Steve' qui existe déjà entraînera la MISE À JOUR de cet enregistrement (pas un nouvel INSERT). Faites attention à cela, car vous pouvez vous attendre à ce que DB renvoie une erreur pour la violation de contrainte UNIQUE KEY qui ne se produira pas ici.

0
sbrbot