在插入数据时,可能需要忽略或替换掉重复的数据(依据某个字段),这时可以在应用层处理,也可以使用复杂的 SQL 语句来处理(如果仅仅知道一些简单的 SQL 语法的话),当然也可以使用一些简单的 SQL 语法,不过它并不是通用所有的数据库类型。
以下所有实例仅针对
MySQL
而言,并不能随意用于其它数据库
表名称:student
Column Name
|
Primary Key
|
Auto Increment
|
Unique
|
id
|
true
|
true
|
|
name
|
|
|
true
|
age
|
|
|
|
初始表数据:
注:以下所有的示例都需要被插入的数据中需要存在
UNIQUE索引
或
PRIMARY KEY
字段,同时这里引入表的主键
id
,并设置成
自动递增
,后面可以看到它的变化
1. 不存在则插入,存在则更新
1.1 on duplicate key update
如果插入的数据会导致
UNIQUE 索引
或
PRIMARY KEY
发生冲突/重复,则
执行
UPDATE
语句
,例:
INSERT INTO `student`(`name`, `age`) VALUES('Jack', 19)
ON DUPLICATE KEY
UPDATE `age`=19;
这里受影响的行数是
2
,因为数据库中存在
name='Jack'
的数据,如果不存在此条数据,则受影响的行数为
1
最新的表数据如下:
1.2 replace into
如果插入的数据会导致
UNIQUE 索引
或
PRIMARY KEY
发生冲突/重复,则
先删除旧数据再插入最新的数据
,例:
REPLACE INTO `student`(`name`, `age`) VALUES('Jack', 18);
这里受影响的行数是
2
,因为数据库中存在
name='Jack'
的数据,并且
id
的值会变成
2
,因为它是先删除旧数据,然后再插入数据,最新的表数据如下:
2. 避免重复插入
关键字/句:
insert ignore into
,如果插入的数据会导致
UNIQUE索引
或
PRIMARY KEY
发生冲突/重复,则忽略此次操作/不插入数据,例:
INSERT IGNORE INTO `student`(`name`, `age`) VALUES('Jack', 18);
这里已经存在
name='Jack'
的数据,所以会忽略掉新插入的数据,受影响行数为
0
,表数据不变。
前言在插入数据时,可能需要忽略或替换掉重复的数据(依据某个字段),这时可以在应用层处理,也可以使用复杂的 SQL 语句来处理(如果仅仅知道一些简单的 SQL 语法的话),当然也可以使用一些简单的 SQL 语法,不过它并不是通用所有的数据库类型。 以下所有实例仅针对MySQL而言,并不能随意用于其它数据库实例表名称:student表字段: Column Name Primary Key
//如果
不存在
,则
插入
新数据 $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[\u2018cat_name\u2019]}\u2019,cat_desc='{$val[‘cat_desc’]}’,keywords='{$val[‘cat_desc
最近这个需求是 php 接收前端数据,然后将数据存入数据库中,但相同记录不能存入。
查了查百度,都把简单的事情复杂化了,竟然还有先查询数据表再判断
插入
的方式(大拇指),通通不采纳,后来直接翻阅了 SQL 手册,最终使用 IGNORE 关键字来做这件事情。
根据设置了主索引 PRIMARY 的字段进行判断,如果字段相同则不做
插入
记录操作,反之
插入
。
(1)一个数据库表,结构如下:
(2)必须设置 需要依靠此字段来判断记录是否相同的 主索引字段,我设置的如下:
假设,你设置 ID 为主索引,那么就会以 ID 作为判断字段,如果 ID 有相同的则不
插入
Mysql
在
插入
数据时,需要
忽略
或替换掉重复的数据(依据某个字段,比如Primary Key或
Unique Key),这时候我们既可以在应用层处理,也可以使用复杂的 SQL 语句来处理(如果仅仅知道一些简单的 SQL 语法的话),当然也可以使用一些简单的 SQL 语法,不过它并不是通用所有的数据库类型。
下面我们以
MySQL
为例,研究一下insert 怎样去
忽略
或替换重复数据
2.表实例
表名称:person
Column Name
Primary Key
背景: 在数据库操作中,有这样一个场景:我们对一批数据进行存储,假如这批数据中有部分数据是重复的,可能是全部重复也可能是部分重复,存储的时候我们要把重复的数据合并。
create table store(
ID int(8) auto_increment primary key,
store_name varchar(255),
store_href varchar(255) unique,
credit_count int(4),
albums_url varchar(120),
phone v
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rgba(51, 51, 51, 1) }
.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .ma...
方案一:使用ignore关键字
如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复
插入
记录可以使用:
代码如下: INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES (‘test9@163.com’, ‘99999’, ‘9999’); 这样当有重复记录就会
忽略
,执行后返回数字0
还有个应用就是复制表,避免重复记录: 代码如下: INSERT IGNORE INTO `table_1` (`name`) SELECT `name` FROM `table_2`; 方案二:使用
毫无疑问,一个文件仅仅只能
存在
于某一台机器上。PS:(拷贝文件可以实现
存在
于多台机器,但是无法实现数据同时修改)
I/O操作效率问题
打开文件读取数据、写入数据关闭文件都数据I/O操作,会大大影响我们程序的执行效率
数据库的诞生就...
private static ObjectMapper mapper = new ObjectMapper();
public static <T> T json2obj(String jsonStr, Class<T> clazz) {
try {
return mapper.readValue(jsonStr, clazz);
} catch (IOException var3) {
throw new IllegalArgumentException("将JSON转换为对象时发生错误:" + jsonStr, var3);
[/code]