mysql如果数据不存在,则插入新数据,否则更新的实现方法

 更新时间:2011年11月12日 16:02:53   作者:  
mysql如果数据不存在,则插入新数据,否则更新的实现方法
//如果不存在,则插入新数据
$sql = "INSERT INTO {$ecs->table(‘cat_lang')} (cat_id,lang_id,cat_name,keywords,cat_desc)
VALUES({$cat_id},{$k},'{$val['cat_name']}','{$val['keywords']}','{$val['cat_desc']}')
ON DUPLICATE KEY UPDATE cat_name='{$val['cat_name']}',cat_desc='{$val['cat_desc']}',keywords='{$val['cat_desc']}'";
这里要注意的是:必须表主键唯一 。这里,这里我采用的是 分类id和语言id双主键机制。

key为唯一键或者主键

(1) key存在则替换,不存在则插入

replace into t_test | CREATE TABLE `t_test` (

`ikey` int(11) NOT NULL default '0',

`value` varchar(21) NOT NULL default '',

`icount` int(11) NOT NULL default '0',

PRIMARY KEY (`ikey`)

) ENGINE=MyISAM DEFAULT CHARSET=gbk |


对于这样一个表.当要记录ikey=1,value='a',icount=0时,由于不知道表里有没有ikey=1的项.我们可能会先select,然后看有没有结果,如果有,则使用update进行更新.如果没有,则使用insert进行插入.


不过在大并发量的数据操作时,可能有时一个有主键的select查询都要用上2s,如果对旧数据不关心,减少不必要的操作显得犹为重要.

使用replace一个语句可以完成上面两个语句的功能,其语法与insert差不多.如上面的操作可以写为replace into t_test set ikey=1,value='a',icount=0;则表中有ikey为1时,先删除旧数据.然后插入新数据.否则直接插入数据.


(2) key存在则更新,不存在则插入

insert into .... on duplicate key update

对于需要根据原记录进行操作的.如表中icount字段用于计数,当没有记录时,插入的value为0,当有记录时,value需要更新为value+1,这时replace就不能完成这个功能.使用insert则可以,其基本语法是insert into ... on duplicate key update...,如上述语句为

insert into t_test set ikey=1,value='a',value2=1 on duplicate key update value2=value2+1;

如果表中有多个唯一索引,如对value字段加个unique key.这时表中有ikey和value两个唯一索引,replace会把所有与其唯一索引值相同的数据项删除,再插入新记录.如表中有两个记录

+------+-------+--------+

| ikey | value | icount |

+------+-------+--------+

| 2 | a | 10 |

| 1 | b | 40 |

+------+-------+--------+

则replace into t_test set ikey=1,value='a',icount=0;会把表中的两条记录都删除,然后插入新记录.

而insert into t_test set ikey=1,value='a',icount=0 on duplicate key update icount=icount+1则只更新一条记录.其效果相当于update t_test set icount=icount+1 where ikey=1 or value='a' limit 1;

相关文章

  • Mysql中关于on,in,as,where的区别

    Mysql中关于on,in,as,where的区别

    这篇文章主要介绍了Mysql中关于on,in,as,where的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 从其他电脑访问本机的Mysql的设置方法

    从其他电脑访问本机的Mysql的设置方法

    如果需要让特定的用户从给定域(例如mydomain.com)的所有计算机上访问 MySQL 服务器,你可以执行在账户名的 host 部分使用了通配符“%” 的 GRANT 语句
    2008-11-11
  • mysql binlog查看指定数据库的操作方法

    mysql binlog查看指定数据库的操作方法

    MySQL 的 binlog(二进制日志)主要记录了数据库上执行的所有更改数据的 SQL 语句,包括数据的插入、更新和删除等操作这篇文章主要介绍了mysql binlog查看指定数据库的方法,需要的朋友可以参考下
    2024-06-06
  • 关于MySQL中“Insert into select“ 的死锁情况分析

    关于MySQL中“Insert into select“ 的死锁情况分析

    这篇文章主要介绍了关于MySQL中“Insert into select“ 的死锁情况分析,死锁是指两个或者多个事务在同一资源上的相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象,需要的朋友可以参考下
    2023-05-05
  • mysql是否需要容器化深入分析

    mysql是否需要容器化深入分析

    这篇文章主要为大家介绍了mysql是否需要容器化深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Mysql用户授权(GRANT)语法及示例解读

    Mysql用户授权(GRANT)语法及示例解读

    这篇文章主要介绍了Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • MySQL中的性别字段到底加不加索引

    MySQL中的性别字段到底加不加索引

    这篇文章主要介绍了MySQL中的性别字段到底加不加索引问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • MySQL的安装与配置详细教程

    MySQL的安装与配置详细教程

    MySQL是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的,本文主要以Mysql免安装版为例,帮助大家解决安装与配置mysql的步骤
    2021-06-06
  • MySQL load语句详细介绍

    MySQL load语句详细介绍

    这篇文章主要介绍了MySQL load语句详细介绍,本文讲解了load的基本语法、文件的路径、配置选项、STARTING LINES选项、TERMINATED LINES选项等内容,需要的朋友可以参考下
    2014-12-12
  • mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法

    mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法

    有时候,我们需要复制某个字段一整列的数据到另外一个新的字段中,或是需要把某个表的某个字段的值跨表复制到另一个表中的某个字段,本文就罗列了一些SQL语句写法,需要的朋友可以参考下
    2014-04-04

最新评论