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. what is a ear

    http://docs.oracle.com/javaee/6/tutorial/doc/bnaby.html An EAR file (see Figure 1-6) contains Java E ...

  2. setenv.bat

    @echo off rem Licensed to the Apache Software Foundation (ASF) under one or more rem contributor lic ...

  3. 使用 xcode 8 构建版本 iTunes Connect 获取不到应用程序的状态的解决办法

              Archive生成Release版本的ipa并将其提交到iTunesConnect,上传成功后我打开iTunesConnect网站登录我的开发账号,准备提交版本更新,然而我却找不到 ...

  4. iOS进阶_三方使用步骤

    一.配置环境(:后为在终端输入的命令) 打开终端 查看自己电脑的Ruby环境:gem sources -l 如果环境已经是淘宝镜像了,此时不需要再进行环境的修改. 如果不是,发送gem sources ...

  5. BZOJ1188 [HNOI2007]分裂游戏(SG函数)

    传送门 拿到这道题就知道是典型的博弈论,但是却不知道怎么设计它的SG函数.看了解析一类组合游戏这篇论文之后才知道这道题应该怎么做. 这道题需要奇特的模型转换.即把每一个石子当做一堆石子,且原来在第i堆 ...

  6. 【转载】Recommendations with Thompson Sampling (Part II)

    [原文链接:http://engineering.richrelevance.com/recommendations-thompson-sampling/.] [本文链接:http://www.cnb ...

  7. python socket server源码学习

    原文请见:http://www.cnblogs.com/wupeiqi/articles/5040823.html 这里就是自己简单整理一下: #!/usr/bin/env python # -*- ...

  8. 查看当前正在运行的activity

    找到sdk的安装路径,比如我的是 D:\prostu\Android\android-sdk\tools该路径下的: hierarchyviewer.bat 双击,可以用此工具查看设备跑的是当前的哪个 ...

  9. NSDate

    NSDate : NSDate *date = [NSDate date];获取当前日期 NSDate 可以进行比较,通过earlierDate:方法获取二个日期中最早的. NSDate 通过late ...

  10. 在浏览器的JavaScript里new Date().toUTCString()后,传递给C# DateTime().TryParse()会发生什么?

    Format 1. Sun, 09 Oct 2016 13:24:35 GMT Format 2. Sun, 9 Oct 2016 13:36:09 UTC Format 1 是在IE里面产生的(Wi ...