web-dev-qa-db-ja.com

重複キー更新時-複数の列

重複キー更新時に挿入... を使用する場合、複数の列を更新する構文は何ですか?

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

更新:私はこれを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’)")

繰り返しになりますが、「更新」でこの最後の部分についてはわかりません。

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

引用符と目盛りを修正しました。

編集:

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 . "'"
 );

値は単一引用符'で囲まれていることに注意してください。値が数値型(INT、FLOATなど)の場合、それらの引用符を削除できます。 counttype、またはtableなどの列名を使用していない限り、列名の周りのバックティックはオプションです。

PHP=の例では、文字列の連結を使用して変数を明確に区別しています。

33
sathia

まあ、これは古いです。ただし、値を指定する必要があるだけですonce、クエリに2回追加する理由はありません(複数の挿入、または準備されたステートメントに便利です)。

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

利点としては、複数の挿入ステートメントでも機能します:

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

クエリは正しいようです。このタイプのクエリの例を次に示します。

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

明確な構文のために、別の構文形式があります。

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

例;

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

データベースにID = 10の顧客が存在しない場合は作成され、列cid、createdon、createdby、cnameが設定されます。存在する場合は更新され、列modifiedon、modifiedbym、cnameが更新されます。

注#1:主キーcid = 0をここに配置すると、AUTO_INCREMENTが発生し(もちろん、pk列がAUTO_INCREMENTとして定義されている場合)、レコードが挿入されます!

注#2:ON DUPLICATE KEY UPDATEは、既存のPK IDレコードを更新します。ただし、UNIQUE KEY列でDUPLICATEが行われた場合も更新されます。たとえば、cname列がUNIQUEであると定義した場合、既に存在するcname = 'Steve'でレコードを保存すると、そのレコードは(新しいINSERTではなく)UPDATEになります。 DBでは、ここでは発生しないUNIQUE KEY制約違反に対してエラーが返されることが予想されるため、このことに注意してください。

0
sbrbot