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如果数据不存在,则插入新数据,否则更新的实现方法的更多相关文章

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

    CREATE TABLE `table_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `my_key` int(11) NOT NULL DEFAULT ...

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

    转自:http://www.jb51.net/article/28885.htm //如果不存在,则插入新数据 $sql = "INSERT INTO {$ecs->table(‘ca ...

  3. 【转载】C#中使用Insert方法往ArrayList集合指定索引位置插入新数据

    ArrayList集合是C#中的一个非泛型的集合类,是弱数据类型的集合类,可以使用ArrayList集合变量来存储集合元素信息,在ArrayList集合操作过程中,可以使用ArrayList集合类的I ...

  4. pandas dataframe取差集:删掉已存在的数据,保留未插入的数据

    适用场景: 插入数据到mysql中,中途中断,导致部分数据未插入成功.避免下次插入时插入了重复的数据. 思路: 1.读取已插入的数据, 2.读取全部数据(包含已插入和未插入的), 3.将已插入的数据添 ...

  5. jqgrid 分页时,清空原表格数据加载返回的新数据

    由于,我们是动态分页,分页后的数据是在触发分页后动态加载而来.如何使jqgrid清空原数据而加载新数据? 1)调用jqgrid的 clearGridData 方法清空表格数据 2)调用jqgrid的  ...

  6. 为什么查询出来的数据保存到Arraylist?插入删除数据为啥用LinkedList?

    引言:这是我在回答集合体系时,被问到的一个问题,也是因为没有深入学习所以回答的并不是很好,所以这两天看了一下,以下是我的一些回答与学习方法. 学习方法:我们学习,系统性的学习肯定是比零散的学习更有效的 ...

  7. mybatis配置文件xml中插入新数据

    初用mybatis,发现很好的一个操作数据库的框架,里面有一些小技巧,挺简单,很实用,记录一下: mybatis的插入语句: <insert id="insertAsset" ...

  8. ado.net 向sql中插入新数据的同时获取自增重的id值

    两种方法都可以实现: 要获取的自增长列为phonebookID 方法一: sql = "insert into phonebook (mobile,peoplename) output in ...

  9. mysql命令行创建表,插入表数据

    create table t_hero( id int unsigned auto_increment primary key, name varchar(10) unique not null, a ...

随机推荐

  1. 用js实现瀑布流的一种简单方法

    现在说瀑布流式布局似乎有点晚了,但是每一项技术都是向着“精”和“简”的方向在不断发展,在发展到极致之前,需要一个相当漫长的过程,因此,从这个角度来说,当瀑布流被应用得越来越多的时候,反而更应该讨论它, ...

  2. PSP&进度条

    11号 类别 开始时间 结束时间 间隔 净时间 燃尽图 8::00 8:20 0 20分钟 站立会议 8:20 8:50 0 30分钟 读构建之法 9:20 13:20 120分钟 120分钟 四人小 ...

  3. XCode一直显示"scanning for working copies"的解决办法

    一个SVN上的项目,在本地重新CheckOut打开后,一直提示"scanning for working copies"且不能使用SVN的更新.提交等功能,当时想着晾它一晚上,看能 ...

  4. [UE4]CustomAnimationBlueprintNode 自定义动画蓝图节点

    目的:在AnimationBlueprint中使用自定义动画控制节点. 主要过程: 1.      引用相关模块.在Client.Build.cs文件中,PublicDependencyModuleN ...

  5. vim : 依赖: vim-common (= 2:7.3.429-2ubuntu2.1) 但是

    Ubuntu 12.10 安装vim出错[日期:2013-01-18] 来源:Linux社区 作者:Cubernet [字体:大 中 小] 在Ubuntu 12.10中安装vim时出现了如下提示:正在 ...

  6. java设计模式--简单工厂模式

     简单工厂设计模式 工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式.它定义一个用于创建对象的接口,由子类决定实例化哪一个类. 核心知识点如下: (1) 大 ...

  7. CAS 4.0.0RC编译环境

    CAS 4.0.0RC编译环境 Eclipse Java EE IDE for Web Developers. JDK1.7,注意用JDK1.8是会出现编译错误的. Maven 在编译出现test错误 ...

  8. 导入aar文件出错

    错误日志: > Could not resolve all dependencies for configuration ':app:_debugCompile'. > Could not ...

  9. switch...case和if...else if的判断应用

    判断成绩所属等级的 两种方法 1...      switch...case方法: #include<stdio.h> int main(void) { ;i <= ;++i) // ...

  10. PHP程序员面临的成长瓶颈

    作为Web开发中应用最广泛的语言之一,PHP有着大量的粉丝,那么你是一名优秀的程序员吗?在进行自我修炼的同时,你是否想过面对各种各样的问题,我该如何突破自身的瓶颈,以便更好的发展呢? PHP工程师面临 ...