My Table structure
table: marks
My objective: i want to insert or update multiple records with the condition
i am currently check by this query
1st step
SELECT * FROM `marks` WHERE `student` =115 AND `param` =1
2nd step
if
records found by matching above criteria i just update record by my new values
else
insert new record into my table
It gonna working fine . but i want to reduce code and optimize this into single query . its possible or not ? I found this on MySQL docs INSERT ... ON DUPLICATE KEY UPDATE . if this is a solution . how can i achieve by query ?
Note: i am using the Yii framework . suggestion from Yii also welcome
Edited: This query does't not update the rows . but escape from insert working correctly
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`)
Check this article Yii INSERT ... ON DUPLICATE UPDATE. They suggest you don't use this feature. But i want it to use, so I extended from CDbCommand my own component and add method for 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);
}
Usage example:
Yii::app()->db->createCommand()->insertDuplicate('user', [
'id' => $this->id,
'token' => $token,
'updated' => date("Y-m-d H:i:s"),
], ['token', 'updated']);
This command will create user with this parameters or update token
and updated
fields if record exists.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With