首页 > 解决方案 > 使用 ON DUPLICATE KEY UPDATE 查询

问题描述

我想在我的插入查询上使用 ON DUPLICATE KEY UPDATE,但显示错误“SQLSTATE [HY000]:一般错误:2031 SQLSTATE [HY000]”。我的查询代码是:

    foreach ($update_config_array as $a => $b){
                $temporary_data =array(
                    "a" => $a,
                    "b" => $b
                );
                $insert_update_query = "INSERT INTO `tbmedia_config` (`config_name`,`config_value`) VALUES (:a,:b) ON DUPLICATE KEY UPDATE `config_name` = :a , `config_value` = :b";
$conn->Tbmedia_runquery($insert_update_query,$temporary_data);

我的渲染查询方法是:

// Execute query
    public function Tbmedia_runquery($query_body = "" ,  $parameter_array = "" ){
        $query = $query_body;

        try{
            $stmt = $this->Tbmedia_connection->prepare($query);

            if(is_array($parameter_array)){
                // declare bind_param variable
                foreach ($parameter_array as $key => &$value) {
                    $stmt->bindParam(":$key",$value);
                    //':$key'
                }
            }

            $stmt->execute();
            return $stmt;
        }catch (\Exception $e){
            echo $e->getMessage();
        }
    }

我哪里错了?


解决了问题就在这里,不能使用相同的变量进行插入和更新换句话说,不能使用:a 和 :b 相同的插入和 ON DUPLICATE KEY UPDATE 而不是使用此代码:

foreach ($update_config_array as $a => $b){
                $temporary_data =array(
                    "a" => $a,
                    "b" => $b,
                    "c" =>$a,
                    "d" =>$b
                );
                $insert_update_query = 'INSERT INTO `tbmedia_config` (`config_name`,`config_value`) VALUES (:a,:b) ON DUPLICATE KEY UPDATE `config_name` = :c , `config_value` = :d';


                $conn->Tbmedia_runquery($insert_update_query,$temporary_data);
            }

标签: phpsqldatabasepdo

解决方案


您不能在一个查询中使用相同的参数名称。这意味着,如果您在“VALUES(:a, :b)”中使用了“:a”,则不能在“ON DUPLICATE KEY UPDATE config_name = :a”中第二次使用它。

正确的查询是:

INSERT INTO 
  tbmedia_config (config_name, config_value) 
  VALUES 
    (:a,:b) 
  ON DUPLICATE KEY UPDATE 
  config_name = VALUES(config_name), config_value = VALUES(config_value)

如果您在 SQL 中使用config_name = VALUES(config_name),它将代替VALUES(config_name)您传递的值作为:a.


推荐阅读