MySQL 当记录不存在时插入 记录存在时自动更新

重要的就是上面提到的 :

INSERT ... SELECT

INSERT ... ON DUPLICATE KEY UPDATE

INSERT ... ON DUPLICATE REPLACE

 
比如想往表中插入一条数据,如果表中没有该条数据才插入,如果已经存在该条数据就不插入。

首先,在创建表时,将不需要重复的字段设置为unique,然后在插入时,使用insert ignore语句

MySQL实现(Duplicate key)如果不存在则插入,存在则更新:

INSERT INTO ipstats VALUES(’192.168.0.1′, 1) ON DUPLICATE KEY UPDATE clicks=clicks+1;

例子

 代码如下 复制代码

mysql> insert into `200702` (`domain`, `2nd_domain`, `tld`, `query_ns1`, `query_ns2`, `report_date`) values ('dnspod.com', 'dnspod', 'com', 1000, 2000, '2007-02-04') ON DUPLICATE KEY UPDATE `query_ns1` = `query_ns1` + 1000, `query_ns2` = `query_ns2` + 2000;
Query OK, 2 rows affected (0.01 sec)

例子2

ysql> insert into `200702` (`domain`, `2nd_domain`, `tld`, `query_ns1`, `query_ns2`, `report_date`) values ('dnspod.com', 'dnspod', 'com', 1000, 2000, '2007-02-04') ON DUPLICATE KEY UPDATE `query_ns1` = `query_ns1` + 1000, `query_ns2` = `query_ns2` + 2000;
Query OK, 1 row affected (0.00 sec)

除了使用INSERT ... ON DUPLICATE KEY UPDATE我们还可以使用(insert if not exists)

示例一:插入多条记录

假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:

 代码如下 复制代码

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, supplier_type
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

示例二:插入单条记录

 代码如下 复制代码

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, ’IBM’, ’advertising’
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

使用 dual 做表名可以让你在 select 语句后面直接跟上要插入字段的值,即使这些值还不存在当前表中。

测试性能发现如果同样多的数据使用INSERT ... ON DUPLICATE KEY UPDATE比起not exists是要好很多了,毕竟前者是mysql自带的一个处理重复数据的语句。

时间: 2024-09-29 21:25:03

MySQL 当记录不存在时插入 记录存在时自动更新的相关文章

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

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

MySQL的源码安装及使用UDFs进行数据自动更新的教程_Mysql

MySQL的源码安装 1. 安装依赖组件 # yum install gcc gcc-c++ ncurses-devel perl -y 2. 安装cmake # wget http://www.cmake.org/files/v2.8/cmake-2.8.12.tar.gz # tar zxvf cmake-2.8.12.tar.gz # cd cmake-2.8.12 # ./bootstrap # make && make install 3. 安装bison # wget http

word插入excel表格并自动更新方法

  如何在word中插入excel表格,并且表格要随着excel文件内容的跟新而更新,我今天简单测试了一下,很容易完成.现在说一下步骤: 在首先之前,插入一句看似没用,实际上又很重要的话:我的office版本是office2003. 首先,建立一个excel表格,里面随便输入一些内容.然后再新建一个word文档,在需要插入表格的地方,选择菜单:[插入(I)]-->[对象(O)...]-->出现对象对话框后,选择第二页[由文件创建(F)]-->[文件名(N)]的右边有[浏览(B)],你可以

Mysql 插入记录 instert语句详解

Mysql 语句之 插入记录 instert 单行插入  代码如下 复制代码 insert into 表名(字段名,字段名, - ) values( 字段值,字段值,-); insert into A(A_e,A_f,A_a) values('字符',10,01); 多行插入  代码如下 复制代码 insert into 表名 values( 字段值,字段值,-),( 字段值,字段值,-); insert into A values('字符',10,01),('字符',10,01);   插入记

mysql中插入记录时不存在时插入已经存在则更新

如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执 行旧行UPDATE.例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果: 代码如下:  代码如下 复制代码 mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=c+1; mysql> UPDATE table SET

MYSQL教程:主表中插入记录从表获取ID

在MySQL中,使用auto_increment类型的id字段作为表的主键,并用它作为其他表的外键,形成"主从表结构",这是数据库设计中常见的用法.但是在具体生成id的时候,我们的操作顺序一般是:先在主表中插入记录,然后获得自动生成的id,以它为基础插入从表的记录.这里面有个困难,就是插入主表记录后,如何获得它对应的id.通常的做法,是通过"select max(id) from tablename"的做法,但是显然这种做法需要考虑并发的情况,需要在事务中对主表加以

MySQL避免重复插入记录方法总结

MySQL 当记录不存在时插入,当记录存在时更新 网上基本有三种解决方法. 第一种: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (client_id, client_name, client_type) SELECT supplier_id, supplier_name, 'advertising' FROM suppliers WHERE not exists (select * from

一条mysql 存在该记录则更新,不存在则插入记录的sql

一条mysql教程 存在该记录则更新,不存在则插入记录的sql INSERT table (auto_id, auto_name) values (1, 'yourname') ON DUPLICATE KEY UPDATE auto_name='yourname' ON DUPLICATE KEY UPDATE的使用 如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE.例如,如果列a被

MySql避免重复插入记录的几种方法_Mysql

方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: 复制代码 代码如下:  INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('test9@163.com', '99999', '9999');   这样当有重复记录就会忽略,执行后返回数字0 还有个应用就是复制表,避免重复记录: 复制代码 代码如下:  INSERT IGNORE