我的表格结构
表:标记我的目标: 我想插入或更新条件
的多个记录我目前正在查询此查询
第一步
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`)
答案 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']);
此命令将使用此参数创建用户,或者如果记录存在,则更新token
和updated
字段。
答案 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();
}