服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|

服务器之家 - 数据库 - Mysql - mysql如果数据不存在,则插入新数据,否则更新的实现方法

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

2019-11-27 16:49MYSQL教程网 Mysql

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不使用MySQL数据库的五个给力理由解析

    不使用MySQL数据库的五个给力理由解析

    众所周知,MySQL数据库虽然功能未必很强大,但因为它的开源、广泛传播,导致很多人都了解到这个数据库。 ...

    mysql教程网1582019-11-15
  • Mysqlmysql proxy问题的解决方法

    mysql proxy问题的解决方法

    最近试用mysql proxy,遇到若干问题,好在一一找到了解决方案,列出来备忘。这次使用的版本是0.6.x,也许新版本就没有这些问题了。 ...

    mysql教程网3742019-10-25
  • MysqlMySQL 管理

    MySQL 管理

    对于网站的开发者来说,MySQL是一个较受欢迎的选择,这不仅是因为它对于任何平台上的非商业应用都是免费的,而且也因为它的架设和使用非常的简单。...

    mysql技术网3072019-10-15
  • MysqlMYSQL随机抽取查询 MySQL Order By Rand()效率问题

    MYSQL随机抽取查询 MySQL Order By Rand()效率问题

    MYSQL随机抽取查询:MySQL Order By Rand()效率问题一直是开发人员的常见问题,俺们不是DBA,没有那么牛B,所只能慢慢研究咯,最近由于项目问题,需要大概研...

    MYSQL教程网3122019-11-26
  • MysqlMySQL与MSSQL使用While语句循环生成测试数据的代码

    MySQL与MSSQL使用While语句循环生成测试数据的代码

    有时候我们测试性能的时候经常需要生产大量的测试数据,用sql语句直接生成的数据更快,需要的朋友可以参考下。 ...

    mysql教程网2932019-11-12
  • MysqlmySQL 延迟 查询主表

    mySQL 延迟 查询主表

    在主外键表存在关系的时候如果加上"lazy=true"的话,则表明延迟,即只查询主表中的内容,而不查询外键表中的内容。 ...

    mysql教程网3902019-11-01
  • Mysqlmysql 索引分类以及用途分析

    mysql 索引分类以及用途分析

    MySQL索引分为普通索引、唯一性索引、全文索引、单列索引、多列索引等等。这里将为大家介绍着几种索引各自的用途。 ...

    MYSQL教程网4012019-11-22
  • Mysqlmysql "too many connections" 错误 之 mysql解决方法

    mysql "too many connections" 错误 之 mysql解决方法

    解决方法是修改/etc/mysql/my.cnf,添加以下一行 ...

    mysql教程网5032019-10-30