使用“INSERT ... ON DUPLICATE KEY UPDATE”插入多个记录

时间:2014-04-21 06:38:14

标签: php mysql yii insert-update

我的表格结构

表:标记 enter image description here

我的目标: 我想插入或更新条件

的多个记录

我目前正在查询此查询

第一步

SELECT * FROM `marks` WHERE `student` =115 AND `param` =1

第二步

if 
    records found by matching above criteria i just update record by my new values 
else
    insert new record into my table 

它会正常工作。但我想减少代码并将其优化为单个查询。它可能与否? 我在MySQL文档 INSERT ... ON DUPLICATE KEY UPDATE 上找到了这个。如果这是一个解决方案。我怎么能通过查询来实现?

注意:我正在使用 Yii框架。来自Yii的建议也欢迎

编辑:  此查询不会更新行。但逃避插入工作正常

INSERT INTO marks(`student`,`param,mark`,`created`,`lastmodified`,`status`) 
VALUES 
(11,30,10,'00-00-00 00:00:00','00-00-00 00:00:00','U')
ON DUPLICATE KEY UPDATE `mark`=VALUES(`mark`)

2 个答案:

答案 0 :(得分:2)

查看此文章Yii INSERT ... ON DUPLICATE UPDATE。他们建议您不要使用此功能。但是我希望它能够使用,所以我从CDbCommand扩展了我自己的组件并为ON DUPLICATE KEY UPDATE添加方法:

public function insertDuplicate($table, $columns, $duplicates)
{
    $params=array();
    $names=array();
    $placeholders=array();
    foreach($columns as $name=>$value)
    {
        $names[]=$this->getConnection()->quoteColumnName($name);
        if($value instanceof CDbExpression)
        {
            $placeholders[] = $value->expression;
            foreach($value->params as $n => $v)
                $params[$n] = $v;
        }
        else
        {
            $placeholders[] = ':' . $name;
            $params[':' . $name] = $value;
        }
    }

    $d = array();
    foreach($duplicates as $duplicate)
    {
        $d[] = '`' . $duplicate . '` = VALUES(`'.$duplicate.'`)';
    }
    $sql='INSERT INTO ' . $this->getConnection()->quoteTableName($table)
        . ' (' . implode(', ',$names) . ') VALUES ('
        . implode(', ', $placeholders) . ') ON DUPLICATE KEY UPDATE ' . implode(', ', $d);
    return $this->setText($sql)->execute($params);
}

用法示例:

Yii::app()->db->createCommand()->insertDuplicate('user', [
   'id' => $this->id,
   'token' => $token,
   'updated' => date("Y-m-d H:i:s"),
], ['token', 'updated']);

此命令将使用此参数创建用户,或者如果记录存在,则更新tokenupdated字段。

答案 1 :(得分:-1)

不要在编程中实现“ INSERT ... ON DUPLICATE ”,因为它是 MySQL特定的。当您从MySQL迁移到其他数据库时,您的程序无法按照Database Abstraction

的概念与新数据库通信

试试这个

    function actionName()
    {
        $id=$_POST['marks']['id']; //Pick the ID from your form values
        $model = Marks::model()->findByPk($id); //Check the records in the Marks table
        if (!$model) //If not found create a new Model for insertion. If records are there it will update the model
            $model = new Marks();
        $model->attributes = $_POST['marks']; //Assign the form values to attributes
        $model->save();
    }