THINKPHP3.2.3写入数据库时,使用“ON DUPLICATE KEY UPDATE” ,达成“存在即更新,不存在即插入” 的功能

    科技2025-06-04  32

    THINKPHP3.2.3 写入数据库时,使用“ON DUPLICATE KEY UPDATE” ,达成“存在即更新,不存在即插入” 的功能

    可能会有很多同学在写入数据库时会遇到类似“如果存在,就更新,否则就新增一条记录”的要求。也见到过有人先查询一遍,然后再判断是否存在,然后再采用对应的方法处理,其实原生的sql语句insert就支持判断是否存在即更新,否则就插入。在语句最后使用“ON DUPLICATE KEY UPDATE”即可。

    那么,在THINKPHP这种高度封装的框架里,应该怎么实现呢,可以看看下方案例:

    首先,需要写入的表,必须有唯一索引的字段,该语句会自动根据唯一索引判断记录是否存在。

    然后,在构建需要insert进表里的数据包时,必须包含唯一索引字段的数据。

    使用add()方法向数据库插入数据时,增加option这个没啥用的参数。 再增加replace=‘xxx,xxx,xxx’ 这个有用的参数, 其中字符串里的xxx,代表如果该记录存在,即更新对应字段名的数据。用逗号分割开。 也可以直接放数组进去。

    案例如下:

    public function test(){ $shopid = 'test'; $itemShop_db = M('syncshopid','','DB_CONFIG'); $updateData= array( 'goodsid' => '352769', 'status' => 1, 'price' => '19.9', 'p_retime' => time(), 'shopid' => 2301, 'qty' => '29', 'q_retime' => time(), ); $result = $itemShop_db->fetchsql(false)->add($updateData,$options=array(),$replace='qty,q_retime,status'); echo $result; }
    Processed: 0.009, SQL: 8