在重复键更新 - 多列

时间:2012-01-24 17:50:39

标签: php mysql sql database

使用insert... on duplicate key update时,更新多列的语法是什么?

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’)")

同样,不确定最后一部分是否有“更新”。

4 个答案:

答案 0 :(得分:32)

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等),则可以删除这些引号。只要您没有使用counttypetable等列名称,就可以在列名称周围使用反引号。

在PHP示例中,字符串连接用于清楚地分离变量。

答案 1 :(得分:23)

嗯,这已经过时了。但是当然你只需要提供一个值一次,没有理由在查询中第二次添加它(这对于多个插入或预处理语句来说很方便):

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) [,...]

答案 2 :(得分:0)

您的查询似乎是正确的。 以下是此类查询的示例:

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']

答案 3 :(得分: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列。如果它确实存在,那么它将被更新并且修改列,modifiedbym,cname将被更新。

注意#1:如果您在此处输入主键cid = 0,它将触发AUTO_INCREMENT(当然,如果pk列定义为AUTO_INCREMENT)并且将插入记录!

注意#2:ON DUPLICATE KEY UPDATE更新现有的PK ID记录。但是如果在任何UNIQUE KEY列上进行DUPLICATE,它也会进行更新。例如,如果您定义了cname列为UNIQUE,则使用cname =&#39; Steve&#39;保存记录。已经存在的将导致该记录的更新(不是新的INSERT)。请注意这一点,因为您可能希望DB返回UNIQUE KEY约束违规的错误,这在此处不会发生。