①唯一索引

唯一索引的目的是为了让数据库的某个字段的值唯一,为了确保数据的都是合法的,但是唯一索引在插入数据时会对数据进行检查,一旦重复会抛出异常,效率会比较低,唯一索引只是保证数据库数据唯一的最后一种手段,而不是最佳方式,更不是唯一方式,为了保证效率最好采用别的解决方案来保证数据的唯一合法性,尽量减少数据库的压力。

②唯一索引
> db.foo.ensureIndex({"username": 1}, {"unique": true})
{
        "createdCollectionAutomatically" : true,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.foo.insert({"username": "mengday", "email": "mengday@163.com", "age": 26})
WriteResult({ "nInserted" : 1 })
// username 重复会报错
> db.foo.insert({"username": "mengday", "email": "mengday2@163.com"})
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error collection: test.foo index: username_1 dup key: { : \"mengday\" }"
        }
})
 
// 第一次 插入不包含索引键的文档,插入成功,不包含索引键系统会默认为索引键的值为null
> db.foo.insert({"email": "mengday3@163.com"})
WriteResult({ "nInserted" : 1 })
 
// 第二次插入不包含唯一索引的键,插入失败,因为不包含键,键的值就null,第一次已经有一个值为null, 再插入null,就是重复
> db.foo.insert({"email": "mengday4@163.com"})
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error collection: test.foo index: username_1 dup key: { : null }"
        }
})
 
// 对多个字段创建唯一索引(关系数据库中的联合主键)
db.user.ensureIndex({"username": 1, "nickname": 1}, {"unique": true})
>

③稀疏索引
稀疏索引:对不存在的键就不进行索引,也就是该文档上没有建立索引,索引条目中也不包含 索引键为null的索引条目,所以再次插入不包含索引键的文档不会报错,直接插入。注意:稀疏索引不光和唯一索引配合使用,也可以单独使用
 
> db.foo.drop()
true
> db.foo.ensureIndex({"username": 1}, {"unique": true, "sparse": true})
{
        "createdCollectionAutomatically" : true,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.foo.insert({"email": "mengday1@163.com"})
WriteResult({ "nInserted" : 1 })
> db.foo.insert({"email": "mengday2@163.com"})
WriteResult({ "nInserted" : 1 })
> db.foo.insert({"username": "mengday3", "email": "mengday3@163.com"})
WriteResult({ "nInserted" : 1 })
> db.foo.insert({"username": "mengday3", "email": "mengday3@163.com"})
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error collection: test.foo index: username_1 dup key: { : \"mengday3\" }"
        }
})

转载于:https://www.cnblogs.com/Lucky-stars/p/10555374.html

第27章:MongoDB-索引--唯一索引相关推荐

  1. 普通索引 唯一索引 主键索引 候选索引

    普通索引 最基本的索引类型,没有唯一性之类的限制.普通索引可以通过以下几种方式创建: 创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表): 修改 ...

  2. 数据库索引——唯一索引、主键索引、聚集索引

    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 索引的一个主要目的就是加快检索表中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构 ...

  3. mysql组合索引 唯一_(四):MySQL建立索引,唯一索引和组合索引

    # (四):MySQL建立索引,唯一索引和组合索引 先大致介绍下项目的数据库信息. 数据库A:主要存放的通用的表,如User.Project.Report等. 数据库B.C.D:一个项目对应一个数据库 ...

  4. mongodb 建立唯一索引,去除重复数据

    如果建立唯一索引的时候,有数据重复,则会报错,所以可以通过以下方法间接解决: 1.将数据导出json格式 ./mongoexport -d liuniu -c tWechatMessage -o tW ...

  5. mongodb创建唯一索引

    粗略的记录一下: 以下是给scheduleTaskName和isActive两个字段加唯一索引 db.scheduleTask.createIndex({scheduleTaskName: 1, is ...

  6. mysql 主键 索引类型_MYSQL常见索引类型(主键索引/唯一索引/普通索引/组合索引)...

    在数据量特别大的数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令MySQL的查询和运行更加高效. 一.MySQL常见的索引类型如下 MySQL常见索引有:主键索引.唯一索引.普 ...

  7. 数据库-索引-普通索引-唯一索引

    MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引和组合索引.单列索引,即一个索引只包含单个列,一个表可以有多个单列索引, ...

  8. Mysql 主键 联合主键 索引 唯一索引 被抠细节问死的问题

    1.一张表中可以有几个主键? 答:一个. 2.那联合主键是什么? 答:一张表多个主键,就是联合主键,可以由多个列形成联合主键,但是主键只能有一个 3.主键作用是什么? 答:主键的作用是保证数据的唯一性 ...

  9. 普通索引 唯一索引 主键索引 组合索引 全文索引

    普通索引 这是最基本的索引,它没有任何限制.它有以下几种创建方式: (1)直接创建索引 CREATE INDEX index_name ON table(column(length)) (2)修改表结 ...

  10. mongodb 对象唯一索引_什么是MongoDB?简介,架构,功能和示例

    通过这个教程,我们将学习如下内容:- 什么是MongoDB? MongoDB功能 MongoDB示例演示 MongoDB架构的关键组件 为什么要使用MongoDB MongoDB中的数据建模 Mong ...

最新文章

  1. 嵌入式系统降低功耗的设计技术
  2. R语言ggplot2可视化:使用ggplot2绘制按时间顺序排列的时间线图(chronological timeline plot)
  3. Java之new一个对象简单过程
  4. 红皮书:变量、作用域和内存问题(四)
  5. 按钮下载Eclipse Color Theme
  6. Spark Accumulator累加器
  7. 模糊规则优化matlab,遗传算法优化模糊pid控制规则
  8. 两种播放m3u8链接的方法
  9. 全志A33_Vstar
  10. springboot+vue公众号页面授权获得微信openId
  11. 个人软件定制开发多少钱,怎么核算
  12. MAUI 跨平台应用开发实战
  13. CODEVS1296
  14. 1年2轮融资团队2倍扩张,180人的产研团队如何有序协同?
  15. Java:使用POI导出Excel文件后打开文件提示因为文件格式或文件扩展名无效而无法打开
  16. 关于wap上网及彩信的一点想法
  17. 微信公众号如何变得更好_过去十年,或者说如何在任何事情上变得更好
  18. HTML中插入自动播放的背景音乐-亲测有效
  19. 谷粒商城 集群篇 (五) --------- DevOps
  20. 伦敦大学学院计算机专业申请条件,伦敦大学学院专业录取要求

热门文章

  1. MQTT 轻量版实例发布,满足更多移动互联场景
  2. apk ionic 破损_cordova – ionic build android不生成任何.apk文件或错误
  3. 以《剑与远征》为例,浅析新型挂机放置游戏的游戏特色特点
  4. 《地狱之刃:塞娜的献祭》如何通过人物情感营造恐怖氛围?
  5. 创造开放世界——《看火人》游戏场景设计
  6. MySQL备份与恢复——基于OUTFILE /LOAD DATA 逻辑备份恢复
  7. pmp每日三题(2022年2月23日)
  8. (课程学习笔记)Python初级入门精讲
  9. react使用setSetat设置多级对象的值
  10. Struts自定义拦截器拦截器工作原理