【问题标题】:On Duplicate Key Update - Multiple Columns关于重复键更新 - 多列
【发布时间】:2012-02-17 23:32:12
【问题描述】:

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

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

【问题讨论】:

    标签: php mysql sql database


    【解决方案1】:

    嗯,这是旧的。但是当然你只需要提供一个值一次,没有理由在查询中第二次添加它(这对于多次插入或准备好的语句很方便):

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

    【讨论】:

    • 这是最好的答案,只需使用 MySQL 支持多次插入的功能
    • col2=VALUES(col2) 后面没有逗号就不行。
    • @wortwart 已修复 :)
    • 这应该在顶部。通过示例简短、简洁且易于理解。直到现在我们都不知道我们可以按列/字段名称引用值。
    【解决方案2】:
    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 示例中,字符串连接用于清楚地分隔变量。

    【讨论】:

    • 查看我的更新,这是在 php 脚本中,因此是语法。如果您现在可以看一下,我将不胜感激。谢谢
    • 您不能对值使用刻度线,这些刻度线应与列名一起使用。使用我在答案中显示的语法。它会起作用的。
    • $result = mysql_query("INSERT INTO table1 ('col1', 'col2', 'col3', 'col4') VALUES (".$val1.", ".$val2.", ".$val3.", ".$val4.") 重复密钥更新 'col2'=".$val2.", 'col3'=".$val3.", 'col4'=".$val4." )
    • 这不起作用:(我知道以前我不必为列名使用刻度线或引号
    • 使用 pdo::quote() 怎么样?
    【解决方案3】:

    为了语法清晰,还有另一种语法形式;

    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)。请注意这一点,因为您可能期望 DB 会返回违反 UNIQUE KEY 约束的错误,这不会在此处发生。

    【讨论】:

      【解决方案4】:

      您的查询似乎是正确的。 这是我的此类查询示例:

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

      【讨论】:

      • 为什么onList=onList+'.$data['onList']. 中需要第二个onList?拥有onList=$data['onList'] 还不够吗?或者在我的例子中:col2='$val2'?
      • 他的做法略有不同,他在onList字段值中添加了$data['onList']。
      猜你喜欢
      • 2010-10-26
      • 1970-01-01
      • 2013-12-13
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多