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;

时间: 2024-10-30 06:55:42

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

mysql 记录不存在时插入 记录存在则更新的实现方法_Mysql

mysql 记录不存在时插入在 MySQL 中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,本文介绍的就是这个问题的解决方案. 问题:我创建了一个表来存放客户信息,我知道可以用 insert 语句插入信息到表中,但是怎么样才能保证不会插入重复的记录呢? 答案:可以通过使用 EXISTS 条件句防止插入重复记录. 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的

pl sql-急求oracle数据库插入新数据如何实时反馈给邮箱?急!急!急!

问题描述 急求oracle数据库插入新数据如何实时反馈给邮箱?急!急!急! 服务器上oracle数据库已经部署, 当oracle数据库中有新数据插入时,能够以邮件的形式反馈给某指定邮箱, 邮件内容要显示插入的数据内容(包括文件和新增的数据项)和插入时间. 注:此操作不用其他语言编写,直接用oracle PL/SQL编写此操作代码,需要此操作完整代码. 比较急,望大家能集思广益,给小弟提出宝贵意见,谢谢~~~ 解决方案 http://www.educity.cn/wenda/414505.html

数据库查询不到数据,完全没有数据,如果给它造一个假数据,但是不能插入到数据里面

问题描述 数据库查询不到数据,完全没有数据,如果给它造一个假数据,但是不能插入到数据里面 数据库查询不到数据,完全没有数据.如何给它造一个假数据,但是不能插入到数据里面. 求指教 解决方案 执行SQL插入数据报什么错了吗?检查你插入的数据格式是否跟表结构一致. 解决方案二: 数据库里面造数据 解决方案三: 这种时候需要把你的错误贴出来,不然很难回答 解决方案四: 1.你的查询语句有问题2.你插入的假数据违反了某种约束或者格式有问题如果还是不能解决,建议 楼主把错误拿出来看看

MySQL插入中文不乱码的5种方法_Mysql

方法一: 登录MySQL,先做 set names latin1 ,然后在更新语句或者执行SQL语句 mysql> set names latin1; mysql> source test.sql; 方法二:在SQL文件中指定set names latin1;然后登录MySQL,执行相应文件 [root@localhost ~]# cat test.sql set names latin1; insert *****************; mysql> source test.sql

C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]

C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Text; namespace PinkDatabaseSync { class DBUtility : IDisposable { private string Server; private string

MySQL 5.6.13 解压版(zip版)安装配置方法_Mysql

[下载MySQL 5.6.13] 从MySQL官方网站mysql.com找到MySQL Community Server 5.6.13的下载地址为http://dev.mysql.com/downloads/mysql/,在这里可以选择操作系统平台.洪哥选择的是Microsoft Windows平台.下面有三个可选的下载文件,第一个是MySQL Installer 5.6 for Windows,这将下载下来一个.msi可执行安装文件.另外有两个解压版(Zip版)分别是Windows (x86,

MySQL 可以用localhost 连接,但不能用IP连接的问题解决方法_Mysql

MySQL localhost 连接,但不能用IP连接问题解决方案 主要涉及到MySQL 可以用localhost 连接,但不能用IP连接的问题 方面的内容,对于MySQL 可以用localhost 连接,但不能用IP连接的问题 1.打开cmd窗口,进入MySQL安装的bin目录 2.执行命令登录数据库,之后会出现一行要你输入密码的 mysql -u root -p 3.执行以下命令分配新用户: grant all privileges on *.* to 'root'@'%' identifi

mysql下普通用户备份数据库时无lock tables权限的解决方法_Mysql

[root@jb51.net]# mysqldump -u dbuser -ppass db > db.sql mysqldump: Got error: 1044: Access denied for user 'dbuser'@'localhost' to database 'db' when using LOCK TABLES 解决一: 加上-skip-lock-tables选项即可.即: [root@jb51.net]# mysqldump -u dbuser -ppass db --s

sql排序分页 如果有新数据插入

问题描述 sql排序分页 如果有新数据插入 sql排序分页 如果有新数据插入并且排序在前面,那取第二页的时候就会有重复数据,而且新插入的数据展示不出来了,怎么解决呢? 各位可能没理解我意思: 比如说现在数据库里面几千万数据,还是实时插入的数据,我想排序后分页取,比如说第一次通过代码给数据库传参取第一页,取100条, 1.这个过程数据库是把所有数据几千万条全部load到内存中排序,然后进行分页,然后取出前100条吗? 2.那第二次,还会再load所有数据一次重新排一次序,再取出101-200之间的