为Discuz 中增加一个数据插入方法支持on duplicate key update

ON DUPLICATE KEY UPDATE的介绍

基本用法:ON DUPLICATE KEY UPDATE 是一种MySQL独有的语法,它在插入新数据时,如果遇到唯一键冲突(即已存在相同的唯一键值),则会执行更新操作,而不是抛出异常或忽略该条数据。这个语法可以大大简化我们的代码,减少不必要的判断和查询操作(ON DUPLICATE KEY UPDATE网上很多,可参考blog.csdn.net/weixin_4911... ,这里就不再赘述)。

其用法总结

1:on duplicate key update 语句根据主键id或唯一键来判断当前插入是否已存在。 2:记录已存在时,只会更新on duplicate key update之后指定的字段。 3:如果同时传递了主键和唯一键,以主键为判断存在依据,该唯一键字段指定内容可以被修改

Disucz 中如何增加on duplicate key update 方法

找到文件:/souce/class/discuz/discuz_database.php,在50行左右,在insert方法前面 新增一个方法updateinsert,此方法与db::insert参数一致。

php 复制代码
public static function updateinsert($table, $data ,$returnid = false, $replace = false, $silent = false) {
        $sql = self::implode($data);
        $insArr = explode(",", $sql);
        foreach ($insArr as $field ){
            $ins = explode("=", $field);
            $insKey[] = $ins[0];
            $insValue[] = $ins[1];
        }
        $Key = implode(",", $insKey);
        $Value = implode(",", $insValue);	
        $table = self::table($table);
        $silent = $silent ? 'SILENT' : '';		
        return self::query("INSERT INTO $table ($Key) values($Value) on duplicate key update $sql", null, $silent, !$returnid);
}

用法举例

创建一个测试表,首次设定信息后,后期除了class字段之外,不定期批量更新其它字段内容。

sql 复制代码
drop table if exists my_table;
create table my_table(
	id int primary key auto_increment comment '主键id',
	customer varchar(30) unique not null comment '客户姓名',
	total int default 2 comment '年龄',
	class varchar(10) comment '组别'
) comment '测试表';
insert into my_table(id,customer,total,class) values(1,'张三',20,'电销组'),(2,'李四',21,'上海组');

// 更新部分字段的数据
$data = array(
    'id' => 1,
    'customer' =>'张三',
    'total' =>321
);

//原来的replace into 方式插入,在更新时会把 class字段清零,
// $res = DB::insert('my_table', $data, true, true); 

// 新的方式会保留 class 字段值
$res = DB::updateinsert('my_table', $data, true, true); 

怎么样,Get到了么?希望对你的项目有帮助!

相关推荐
老孙讲技术13 分钟前
集成商选型笔记:原生 OpenSDK(低延迟)vs Web 轻应用(7 天上线)怎么选
后端
大鸡腿同学27 分钟前
AI 智能剪辑
后端
运维行者_29 分钟前
广域网性能监控:分布式IT架构下的链路质量保障
开发语言·网络·分布式·后端·架构·数据库架构
灯澜忆梦34 分钟前
GO---map函数
开发语言·前端·后端·golang
QQ_216962909644 分钟前
【项目编号:project05966】SpringBoot/Vue 电影推荐系统:用户端推荐、电影资讯与后台数据管理全流程
vue.js·spring boot·后端
用户6757049885021 小时前
手摸手教你玩 Jenkins,一次搞懂 CI/CD!(第三章:发布之nodeAgent)
后端·jenkins
用户713874229001 小时前
深入 Claude Code 的 settings.json
后端
张三丰21 小时前
LEFT JOIN 到底什么时候会被优化器偷偷改写成 INNER JOIN
后端
SamDeepThinking1 小时前
一次线程池线上故障复盘:四层防线如何避免数据丢失
java·后端·程序员
用户40966601317511 小时前
MySQL 索引优化速查表:3 分钟定位慢查询根因
后端