大家好,又见面了,我是你们的朋友全栈君。
逻辑上我们需要怎么写:
$result = mysql_query('select * from xxx where id = 1');
$row = mysql_fetch_assoc($result);
if($row){
mysql_query('update ...');
}else{
mysql_query('insert ...');
}
但是这样写有两个问题?
1、效率太差,每次执行都要执行2个sql
2、高并发的情况下数据会出问题,不能保证原子性
ON DUPLICATE KEY UPDATE 可以达到以下目的:
向数据库中插入一条记录:若该数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。否则插入一条新的记录。
注意事项:
1,若多个索引都冲突,则只有一条记录被修改。具体原因→
2,插入返回1,修给返回2,具体原因→
事例源码:
$data = [
'id' => 1,
'name' => 'aa',
'age' => 12,
];
$tabe = 'table_name';
public function batchUpdateInsert($data,$table)
{
if (!is_array($data) || !$table) {
return false;
}
$key = array_keys($data[0]);
$field = '('.implode(',',array_values($key)).')';
$bindField = '';
foreach($key as $val){
$bindField .= $val.'=VALUES('.$val.'),';
}
$bindField = trim($bindField,',');
$value = '';
foreach($data as $val){
$value .= '('.implode(',',array_map(function( $v ){
return "'".$v."'";},array_values($val))).'),';
}
$value = trim($value,',');
$sql = sprintf("INSERT INTO %s %s VALUES %s ON DUPLICATE KEY UPDATE %s", $table, $field, $value, $bindField);
return $sql;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/105863.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...