文档章节

MySQL 唯一索引的使用

learn_more
 learn_more
发布于 2017/11/03 17:28
字数 1280
阅读 1.3K
收藏 0

 

1、MySQL 唯一索引的使用

普通索引允许被索引的数据列包含重复的值。唯一索引则是不允许有重复的值,当然 null 除外,唯一索引不仅仅可以存储 null , 还可以存储多个 null。

如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。

这么做的好处:

1)简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;

2)MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了,如果是,MySQL将拒绝插入那条新记录。

总之:唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。个人建议,数据关系应该不仅仅使用主键来标记记录的唯一性,而且也要使用逻辑主键来确定唯一性,也就是把逻辑主键建立唯一索引。

 

 

 

2、唯一索引用来更新

对于数据保存操作(新增或更新),我们一般使用先删除后插入,因为这样操作简单。但是其实这样也不简单,要是更新操作的时候只有逻辑主键没有物理主键,那么查询也需要分情况编写。但是如果你有逻辑主键且作为了唯一索引,那么就可以使用 MySQL 的 ON DUPLICATE KEY UPDATE

或者 REPLACE INTO

 

1)ON DUPLICATE KEY UPDATE

如果您指定了 ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个 UNIQUE 索引 或PRIMARY KEY中出现重复值,则执行 UPDATE。

 

A:单条插入

例如,如果列a被定义为Primary 或 UNIQUE,并且包含值1,则以下两个语句具有相同的效果:

mysql>INSERT INTO table (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1;

mysql>UPDATE table SET c=c+1 WHERE a=1;

 

B:多条插入

批量插入时,可以使用如下语句进行重复则更新,没有则插入。

mysql>INSERT INTO table (a,c) VALUES (1,3),(2,4)

ON DUPLICATE KEY UPDATE c = VALUES(c);

 

 

2)REPLACE INTO

使用REPLACE插入一条记录时,通过判断 primary key 或 unique 索引 ,如果没有重复,REPLACE就和INSERT的功能一样,如果有重复记录,REPLACE就使用新记录的值来替换原来的记录值。

 

A:单条插入

例如,如果列a被定义为Primary 或 UNIQUE,并且包含值1,则以下两个语句具有相同的效果:

mysql>REPLACE INTO table (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1;

mysql>UPDATE table SET c=c+1 WHERE a=1;

 

B:多条插入

批量插入时,可以使用如下语句进行重复则更新,没有则插入。

mysql>REPLACE INTO table (a,c) VALUES (1,3),(2,4)

 

总结,如果是需要字段关联更新那么使用 ON DUPLICATE KEY UPDATE,但是如果是已经知道更新的值了那么直接使用 REPLACE INTO 更简单。

 

 

 

3、真实案例:错题本重复生成问题

错题本有个字段 exam_base_id 建立了普通的索引,

然后我一直以为如果用索引字段作为条件进行删除那么这些数据肯定会被锁死,换句话说下一个操作语句过来肯定需要等待,这样理解本身没错,前提是必须要有对应的数据被锁,如果本身就没有数据那么,Mysql又如何锁住这些数据呢?

且看下面的执行记录(前提 select * from t_w where exam_base_id = 10 没有任何记录 )

t1

t2

delete from t_w where exam_id = 10

 

 

delete from t_w where exam_id = 10

insert into t_w select ... where exam_id = 10

 
 

insert into t_w select ... where exam_id = 10

commit

 
 

commit

select * from t_w 结果会发现有重复的记录,道理就是上面说的,无论事务1还是事务2,在通过exam_id删除数据时,因为没有记录被锁定,所以导致两个事务可以同时执行,为了解决重复数据问题,我觉得用唯一索引会比较好

总结:唯一索引不但可以调高查询效率而且可以保证数据的唯一性!!

 

参考:

http://lobert.iteye.com/blog/1604122

© 著作权归作者所有

上一篇: mongoDB 3.0+ explain
下一篇: MySQL 锁之死锁
learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
加载中

评论(0)

PHP面试之数据库—创建高性能索引

真题 简单描述MySQL中,索引、主键、唯一索引、联合索引的区别,对数据库的性能有什么影响? MySQL索引的基础和类型 索引:类似于书籍的目录,想找到一本书的某个特定的主题,需要先找到书的...

openoter
2018/04/19
0
0
MySQL数据库索引

MySQL数据库索引分成三类:普通索引,唯一索引和主索引 1、普通索引   普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条...

满小茂
2016/08/23
120
0
mysql select 执行过程查询关键字 explain

语法:explain select .... 变体: 1. explainextended select .... 将执行计划“反编译”成select语句; 运行showwarnings 可以得到被mysql优化器优化后的语句 2. explainpartitions selec...

常翔
2013/11/22
425
0
MySQL——通过EXPLAIN分析SQL的执行计划

在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。 下面分别对EXPLAIN命令结果的每一列进行说明: select_type:...

撸码那些事
2018/08/03
0
0
MySQL专题9之MySQL索引、MySQL临时表、MySQL复制表

1、MySQL索引 - MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 - 打个比方,如果合理的设计并使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索...

极客微信条
2017/11/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

00-Java 面试准备

面试之前 面试前准备简历需要注意的几个方面: 写简历、改简历,这个一定要干的。简历有两个作用,一个是吸引别人,能让别人邀请你去面试,这是前提;另一个是引导面试的人,让面试的人问你所...

源程序
今天
54
0
OSChina 周二乱弹 —— 大王(@罗马的王)颜值制霸Osc社区

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @巴拉迪维 :Lunik的单曲《Seeing You Soar》 I hope you’re smiling,When seeing me soar. #今日歌曲推荐# 《Seeing You Soar》- Lunik 手...

小小编辑
今天
83
0
wordcount代码

1.写出map类 public class WCMapper extends Mapper<LongWritable,Text,Text,LongWritable>{ @Override protected void map(LongWritable key,Text value,Context context)throws IOExcepti......

七宝1
今天
59
0
Spring Batch 小任务(Tasklet)步骤

Chunk-Oriented Processing不是处理 step 的唯一方法。 考虑下面的一个场景,如果你仅仅需要调用一个存储过程,你可以在 ItemReader 中实现这个调用,然后在存储过程完成调用后返回 null。这...

honeymoose
今天
67
0
Linux日志分析

1. Linux日志文件的类型 2. 系统服务日志 2.1 syslogd的简介 2.2 syslogd的配置和使用 2.3 日志的安全性设置 2.4 远程日志记录服务 3. 日志的轮替 3.1 logrotate简介 3.2 logrotate的配置 3....

JiaMing
昨天
67
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部