MySQL_插入更新 ON DUPLICATE KEY UPDATE

本文探讨了在高并发场景下使用ON DUPLICATE KEY UPDATE的高效性和原子性优势,对比传统的先查询后更新或插入的方法,有效避免了数据冲突和效率低下问题。通过实例演示了如何批量更新或插入数据,确保数据一致性和系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

逻辑上我们需要怎么写:

$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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值