精华内容
下载资源
问答
  • Mysql唯一索引 唯一约束

    万次阅读 2017-09-28 23:37:42
    Mysql唯一索引 唯一约束唯一索引作为mysql众多索引常用的一种,再一次业务中了解到此索引特在此记载Mysql唯一索引 唯一约束 唯一索引的的作用 唯一索引与唯一约束的区别 添加删除唯一索引的sql语句 需要注意的坑唯一...

    Mysql唯一索引 唯一约束

    唯一索引作为mysql众多索引常用的一种,在一次业务代码编写中详细了解了下此索引在此记载,如果错误地方还望同学们斧正

    唯一索引的的作用

    顾名思义,唯一索引,即是唯一的意思,在数据库表结构中对字段添加唯一索引后进行数据库进行存储操作时数据库会判断库中是否已经存在此数据,不存在此数据时才能进行插入操作。

    这虽然是个小技能,但实际上在业务开发中是个很实用的技能, 比如在高并发业务中,数据库单实例的话如何杜绝数据并发插入两条相同的订单号呢? 添加一个唯一索引当然是最快捷的方法之一,当然是添加索引还是通过业务代码去解决因公司业务而定

    唯一索引与唯一约束的区别

    对于这两个不同的名词百度了很久,在mysql中貌似唯一约束就是唯一索引,并没有什么不同,可能叫法不同,在sqlserver中区分还是挺明确的。 sqlserver唯一索引和约束的区别

    博客中的一句话说的很在理,你为了做到数据不能有重复值,但是数据库怎么保证没有重复值呢?当然是在存储数据的时候查一遍,那么怎样查找快呢? 当然是创建索引,所以,在创建唯一约束的时候就创建了唯一索引。这可能也是mysql的一个优化机制

    添加/删除唯一索引的sql语句

    添加索引
    alter table table_name add unique( column)
    删除索引
    alter table table_name drop index colum_name

    需要注意的坑

    再添加唯一索引后还有一种特殊情况,那就是如果该字段没有限制非空的话,存在插入NULL值的情况,此时,唯一索引并不起作用,也就是你可以插入n条该字段为null的数据。

    除此之外,如果插入空字符串的话,
    例如
    ‘’
    ‘ ’
    不管中间是多少个空字符串在插入的时候都算作‘’ ,即,空串不论多长,只能插入一条。具体代码大家可以自己实现一下

    展开全文
  • Mysql唯一索引和普通索引的区别,

    千次阅读 2020-07-15 16:47:31
    文章目录Mysql唯一索引和普通索引的区别,那种速度快一点,原因是啥理由说明:结论:1 普通索引2 唯一索引注意:唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n)。3 主索引4 外键索引5 复合索引...

    Mysql唯一索引和普通索引的区别,那种速度快一点,原因是啥

    其实,如果业务上就要求我们数据库的值必须是唯一的,那没什么好讨论的,就选择唯一索引;那么如果业务上要求不严格,或者说不需要我们数据库后台来保障唯一性要求,这时候我们选择唯一索引还是普通索引就看谁在性能上更好,谁好选谁。

    唯一索引和普通索引怎么选择

    理由说明:

    我们都知道一个索引就是创建一个B+树,如果他是一个普通索引我们现在去查找,当查找到符合的数据的时候这个时候他就会在进行第二次查找,因为列里面的数据是唯一的,所以第二次查找肯定是没有数据的,这一次查找通过二分法去查找B+树查找到二叉树的叶子结点,每个叶子结点都会对应一个数据块(数据页),如果这个数据页在内存中那么他也就不用去在磁盘或硬盘去读区这个数据了,直接在内存中读取,我们也知道一个数据块大概是可以存储几千条数据的,所以在第一次查找的时候刚好这个数据块的尾部,在进行第二次查找的时候就要在进行IO读取了 一次IO读取是很低效的。但是如果是唯一索引的话这样的话就不会再进行第二次读取了,所以在最坏的情况下,普通索引和唯一索引的最大区别是多进行一次IO读取,概率极小。
    update:
    2.在update或者insert的时候普通索引也就是去在B+ 树中去找位置然后按照B+树的算法结构更新放入 或者更新其结构(拓展:在创建索引的时候会降低更新和插入效率,因为B+树在某种情况下添加结点效率会比较低),这在innoDB中如果说是在内存中没有这个数据块那么在这个情况下他不会去现在就去更新,会将这个更新操作存储在ChangeBuffer上,当第二次有查找这个数据的时候再去读取这个数据块然后再执行这个ChangeBuffer 中的数据操作,meger 这个数据。(在redlog里面也会存一份,也会存储changeBuffer的才操作数据,ES(Elaticsearch)的一种同步方式是通过redo log 来进行是实时同步的),当唯一索引进行更新操作的时候 会先进行一次查找是否唯一,再进行和普通索引一样的操作。所以在符合业务逻辑和无误的前提下:唯一索引比普通索引多一个查找操作。(在进行insert的时候会根据主键来进行查住 主键索引的数据结构发生改变)

    结论:

    在符合业务场景的前提下的时候唯一索引还是少用多用用普通索引。 还有就是change Buffer的使用 在更新读取少的 情况下放大change buffer的存储量 因为chanbuffer量越大其变更的数量更多 减少的IO次书更多,性能也就提高了。

    1 普通索引

    普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

    2 唯一索引

    • 普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次。
    • 如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。
    • 这么做的好处:一是简化了mysql对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。
    • 也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

    注意:唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n)。

    3 主索引

    在前面已经反复多次强调过:必须为主键字段创建一个索引,这个索引就是所谓的"主索引"。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE。

    4 外键索引

    如果为某个外键字段定义了一个外键约束条件,MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。

    5 复合索引

    索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引。这种索引的特点是MySQL可以有选择地使用一个这样的索引。如果查询操作只需要用到columnA数据列上的一个索引,就可以使用复合索引INDEX(columnA, columnB)。不过,这种用法仅适用于在复合索引中排列在前的数据列组合。比如说,INDEX(A, B, C)可以当做A或(A, B)的索引来使用,但不能当做B、C或(B, C)的索引来使用。

    6 全文索引

    文本字段上的普通索引只能加快对出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作。如果字段里存放的是由几个、甚至是多个单词构成的较大段文字,普通索引就没什么作用了。这种检索往往以LIKE %word%的形式出现,这对MySQL来说很复杂,如果需要处理的数据量很大,响应时间就会很长。
      这类场合正是全文索引(full-text index)可以大显身手的地方。在生成这种类型的索引时,MySQL将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录。全文索引即可以随数据表一同创建,也可以等日后有必要时再使用下面这条命令添加:
      ALTER TABLE tablename ADD FULLTEXT(column1, column2)
      有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。下面是这类查询命令的基本语法:
      SELECT * FROM tablename
      WHERE MATCH(column1, column2) AGAINST(‘word1’, ‘word2’, ‘word3’)
      上面这条命令将把column1和column2字段里有word1、word2和word3的数据记录全部查询出来。
      注解:InnoDB数据表不支持全文索引。

    参考:
    唯一索引和普通索引怎么选择
    唯一索引和普通索引
    唯一索引和普通索引的区别

    展开全文
  • 在业务代码已经保证插入身份证唯一的情况下,可以选择建立唯一索引和普通索引,这时该如何选择呢?接下来,将从查询和更新的执行过程进行分析。 查询过程 假设 k 是表 t 上的索引,在搜索 select id from t where k=...
  • 索引(四)使用MySQL唯一索引避免重复

    千次阅读 2019-08-02 13:49:33
    一:介绍MYSQL唯一索引 如果要强烈使一列或多列具有唯一性,通常使用PRIMARY KEY约束。 但是,每个表只能有一个主键。 因此,如果使多个列或多个组合列具有唯一性,则不能使用主键约束。 幸运的是,MySQL提供了另一种...

    摘要:这篇文章中,我们会一起聊下如何使用MySQL 索引防止一个表中的一列或者多列产生重复值

    一:介绍MYSQL唯一索引

    如果要强烈使一列或多列具有唯一性,通常使用PRIMARY KEY约束。 但是,每个表只能有一个主键。 因此,如果使多个列或多个组合列具有唯一性,则不能使用主键约束。

    幸运的是,MySQL提供了另一种索引,叫做唯一索引,允许我们可以使一个或者多个列的值具有唯一性。另外,不会像主键索引一样,我们的每张表中可以有很多个唯一索引

    为了创建一个唯一索引,我们可以来使用CREATE UNIQUE INDEX语法
    创建唯一索引语法

    如果想要在一个已存在表中添加一个唯一索引,我们可以使用下列的ALTER TABLE语句

    ALTER  TABLE  table_name  ADD  INDEX  index_name( column_1,column_2 ) ;
    

    有一点值得注意下:
    与其他数据库系统不同,MySQL将NULL值视为不同的值。所以,可以在唯一索引中包含很多的空值另一个重点是UNIQUE约束不适用于除BDB存储引擎之外的NULL值。

    二:MySQL唯一索引举例

    假设我们要管理应用程序中的联系人,并且还希望联系人表的每个联系人的电子邮件必须是唯一的。那我们就可以使用CREATE TABLE语句创建唯一约束来满足我们的需求,如下:

    CREATE TABLE IF NOT EXISTS contacts (
        id INT AUTO_INCREMENT PRIMARY KEY,
        first_name VARCHAR(50) NOT NULL,
        last_name VARCHAR(50) NOT NULL,
        phone VARCHAR(15) NOT NULL,
        email VARCHAR(100) NOT NULL,
        UNIQUE Index unique_email (email)
    );
    

    我们使用show indexes from contacts就能够看到mysqlemail这一列中创建一个唯一的索引

    现在我们向contacts表中插入一行数据来看下

    INSERT INTO contacts(first_name,last_name,phone,email)
    VALUES('John','Doe','(408)-999-9765','john.doe@mysqltutorial.org');
    

    现在我们尝试插入一行email列中有john.doe@mysqltutorial.org, 这时我们就会得到一个报错的信息。

    INSERT INTO contacts(first_name,last_name,phone,email)
    VALUES('Johny','Doe','(408)-999-4321','john.doe@mysqltutorial.org');
    

    报错如下:

    Error Code: 1062. Duplicate entry 'john.doe@mysqltutorial.org' for key 'unique_email'
    

    假设我们要一个first_namelast_namephone的联合索引,我们可以使用下面的语法来得到

    CREATE UNIQUE INDEX idx_name_phone
    ON contacts(first_name,last_name,phone);
    

    所以添加了 first_name, last_name, and phone已经存在的行,也是会造成错误的

    INSERT INTO contacts(first_name,last_name,phone,email)
    VALUES('john','doe','(408)-999-9765','john.d@mysqltutorial.org');
    

    报错如下:

    Error Code: 1062. Duplicate entry 'john-doe-(408)-999-9765' for key 'idx_name_phone'
    

    总结下,在这篇文章中,我们学习到如何使用mysql unique index去避免数据库中的重复值了。建议同学们下面能够亲自去实践下

    翻译参考:
    Using MySQL UNIQUE Index To Prevent Duplicates

    展开全文
  • 创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复(在插入数据的时候,如果唯一索引的插入值重复,所以插入就会报错),索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。...

    创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复(在插入数据的时候,如果唯一索引的插入值重复,则插入就会报错),索引可以有多个但索引列的值必须唯一,索引列的值允许有空值。

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

    CREATE TABLE `wb_blog` (       
       `id` smallint(8) unsigned NOT NULL,       
       `catid` smallint(5) unsigned NOT NULL DEFAULT '0',       
       `title` varchar(80) NOT NULL DEFAULT '',       
       `content` text NOT NULL,       
       PRIMARY KEY (`id`),       
      )
    

    1、创建唯一索可以使用关键字UNIQUE随表一同创建

    mysql> CREATE TABLE `wb_blog` (  
        ->   `id` smallint(8) unsigned NOT NULL,  
        ->   `catid` smallint(5) unsigned NOT NULL DEFAULT '0',  
        ->   `title` varchar(80) NOT NULL DEFAULT '',  
        ->   `content` text NOT NULL,  
        ->   PRIMARY KEY (`id`),  
        ->   UNIQUE KEY `catename` (`catid`)  
        -> ) ;  
    9 Query OK, 0 rows affected (0.24 sec)
    

    上面代码为wb_blog表的’catid’字段创建名为catename的唯一索引

    2、在创建表之后使用CREATE命令来创建

    mysql> CREATE UNIQUE INDEX catename ON wb_blog(catid);  
    
    Query OK, 0 rows affected (0.47 sec)
    

    如果不需要唯一索引,则可以这样删除

    mysql> ALTER TABLE wb_blog DROP INDEX catename;  
    
    Query OK, 0 rows affected (0.85 sec)
    

    如果要增加索引

    alter table user add unique index(user_id,user_name);
    

    注意

    唯一索引
    它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

    创建索引:

    CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
    

    修改表结构:

    ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
    

    创建表的时候直接指定:

    CREATE TABLE tableName ( 
    	[...],
    	UNIQUE [indexName] (tableColumns(length));
    

    3.主键索引

    它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

    CREATE TABLE testIndex(
    	i_testID INT NOT NULL AUTO_INCREMENT,
    	vc_Name VARCHAR(16) NOT NULL,
    	PRIMARY KEY(i_testID)
    );
    

    当然也可以用ALTER命令。

    展开全文
  • 别踩坑!使用MySQL唯一索引请注意

    万次阅读 多人点赞 2019-01-28 21:33:14
    背景 在程序设计中了,我们往往需要确保数据的唯一性,比如在常见的注册模块,我们需要确保一个手机号只能注册为一个账号。...但是我们不能确保同时有两个人使用...不同存储方案,解决方式不一样,这里以MySQL为例,我...
  • 普通索引 这是最基本的索引类型,而且它没有唯一性之类的限制。 唯一性索引 这种索引和前面的“普通索引”基本相同,...对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索...
  • 对查询:普通索引和唯一索引对查询性能影响很小 对更新:唯一索引比普通索引更耗时. 查询流程:唯一索引找到第一个匹配数据后不继续往后查找. 1.普通索引,从索引树根节点开始按层往下查找,找到对应的数据页,然后...
  • mysql唯一索引和普通索引的选择

    千次阅读 2019-02-27 14:19:27
    如果业务能够保证唯一性应该尽量选择普通索引而不是唯一索引 从查询和更新两方面说明: 查询: 查询来说二者的区别是 普通索引查到符合条件的项后会继续查找下一项,如果下一项不符合再返回 唯一索引则是查到符合...
  • mysql唯一索引冲突的解决方案

    千次阅读 2019-04-08 23:50:02
    如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: insert ignore into insert ignore into(使用唯一索引再次插入相同的值会忽略提示*如果insert into 数据库会报错*,相同值...
  • Mysql唯一索引区分大小写问题

    千次阅读 2020-07-20 10:23:37
    但是mysql数据库做好了唯一索引后,插入这种数据报错,原因当然是唯一字段不区分大小写了。 只要修改一下就好了 ALTER TABLE [表名称] MODIFY [字段名称] [VARCHAR(30)] BINARY; 注意: 字段名称后面的 VAR
  • Mysql 唯一索引冲突处理

    千次阅读 2017-07-21 12:32:58
    Mysql插入时遇到唯一索引冲突, 1、自动替换为新的值,可以用ON DUPLICATE KEY UPDATE xxx= VALUES(xxx) 2、忽略插入是 insert ignore into 3、删除旧记录,插入新记录是 replace into,如果这个记录id有在其他表...
  • MYSQL 引擎innodb ,设置了唯一索引的列值 允许 多个NULL值存在。 示例: 字段 userCardNum 添加了唯一索引 证实是允许存在的多个NULL值数据的: 原由: 因为这里 NULL 的定义 ,是指 未知值。 所以多...
  • mysql 唯一索引区分大小写

    千次阅读 2019-11-27 09:20:50
    这取决于字段的排序规则-如果是ci(不区分大小写)或cs(区分大小写)。唯一索引将相应地应用。
  • mysql唯一索引创建

    千次阅读 2016-08-09 11:20:20
    1.建表时加上唯一性约束   CREATE TABLE `t_user` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(18) NOT NULL unique, `password` varchar(18) NOT NULL, PRIMARY KEY (`Id`) www.2cto.com ...
  • mysql唯一索引 不区分大小写

    千次阅读 2017-09-20 16:10:51
    工作中为了存放个人标签,建了一张TAG表,把tag_name和user_id设置为了唯一索引,结果保存时发现同一人不能同时保存UI和ui的数据,最后查了下,发现mysql唯一索引需要特殊设置才能区分大小写。。。  具体操作: ...
  • mysql唯一索引和unique

    万次阅读 2016-05-28 19:10:31
    唯一索引可以对多个列都做,并且它是可以为空的,它虽然叫做索引,但是它主要是用来防止某些列的重复的,而不是专门用来查找的,所以和普通的索引的效率差别????(等我知道了再解释~) 最后附上这次实验的...
  • mysql 唯一索引的添加删除

    千次阅读 2018-11-25 10:01:31
    文章来自:源码在线https://www.shengli.me/php/299.html                                        
  • MySQL 唯一索引,并发插入导致死锁

    千次阅读 2020-07-28 00:12:46
    一日志 ------------------------ LATEST DETECTED DEADLOCK ------------------------ 2020-07-27 16:28:53 0x7fc914aee700 ...mysql tables in use 2, locked 2 LOCK WAIT 3 lock struct(s), h
  • Mysql 唯一索引 防止重复插入数据

    千次阅读 2018-06-06 23:32:32
    一般的批量插的 sql语句出现重复将会直接报错insert into tb_name (field1,field2) values(f11,f12) ...Duplicate entry ' ' for key '索引'")解决方法:在语句中添加 ignore 关键字insert ignore into tb_n...
  • mysql唯一索引已有键值冲突解决办法

    千次阅读 2014-03-30 11:44:54
    唯一索引: alter ignore table tmp_qw2 add unique key uk_uid(user_id); IGNORE is a MySQL extension to standard SQL. It controls how ALTER TABLE works if there are duplicates on unique keys in ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 150,851
精华内容 60,340
关键字:

mysql唯一索引

mysql 订阅