使用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就能够看到mysql在email这一列中创建一个唯一的索引

现在我们向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');

报错如下:

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

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');

报错如下:

还有个技巧,在设置好索引的情况下,把insert into 改为 insert ignore into,也可成功实现不重复插入相同数据,

与上面的区别是:上面会报错,加上ignore不会报错,运行结果只会提示------------ 受影响的行: 0

这样非常方便爬取数据的存储。

参考文章:https://zhuanlan.zhihu.com/p/76925239

mysql 唯一索引出现重复数据_mysql使用唯一索引避免插入重复数据相关推荐

  1. mysql索引能重复吗_mysql重复索引与冗余索引实例分析

    本文实例讲述了mysql重复索引与冗余索引.分享给大家供大家参考,具体如下: 重复索引:表示一个列或者顺序相同的几个列上建立的多个索引. 冗余索引:两个索引所覆盖的列重叠 冗余索引在一些特殊的场景下使 ...

  2. mysql建立索引 有什么缺陷_MySQL数据库建立索引的优缺点以及什么样的字段适合建立索引...

    建立索引的优缺点: 为什么要创建索引呢? 这是因为,创建索引可以大大提高系统的性能. 第一.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. 第二.可以大大加快 数据的检索速度,这也是创建索 ...

  3. mysql主键可以重复吗_mysql 处理主键重复

    select * from stock; -- 1.批量插入,忽略主键重复的数据 insert IGNORE into insert IGNORE into `stock` (`id`,`name`, ...

  4. mysql数据库导入后莫名丢失_MySQL数据库导入或者同步大量数据时数据丢失解决方案...

    相信大家都经常遇到这样的情况,我们在编码的过程中经常需要在调试代码的时候切换到本地的数据库上做修改调试,如果当测试数据库的数据在几十万或者上百万数据的时候,我们无论是通过恢复备份/导入SQL的方式来把 ...

  5. MySQL 批量插入,如何不插入重复数据?根据条件 MyBatis不插入重复数据

    目录 前言 解决方案 1.insert ignore into 2.on duplicate key update 3.insert - select - where not exist 4.repl ...

  6. mysql 唯一索引出现重复数据_MySQL 创建唯一索引忽略对已经重复数据的检查

    MySQL 创建唯一索引忽略对已经重复数据的检查 在创建唯一索引的基础上加上关键字"IGNORE "即可. # 重复数据 mysql> select aid,count(ai ...

  7. mysql如何装上亿数据_mysql千万或者上亿的数据怎么设计数据库

    1.首先可以考虑业务层面优化,即垂直分表. 垂直分表就是bai把一个数据量很大的表,可以按某个字段的属性或使用频繁程度分类,拆分为多个表. 如有多种业务类型,每种业务类型入不同的表,table1,ta ...

  8. MySQL与优化有关的命令_MySQL优化全攻略-相关数据库命令

    MySQL优化全攻略-相关数据库命令 更新时间:2006年11月25日 00:00:00   作者: 接下来我们要讨论的是数据库性能优化的另一方面,即运用数据库服务器内建的工具辅助性能分析和优化. ▲ ...

  9. mysql中怎么删除表中的一列数据_mysql如何删除表中一行数据?

    mysql中使用DELETE语句删除表中一行数据,语句为"DELETE FROM 表名称 WHERE 列名称 = 值".删除所有行的语句为"DELETE FROM tab ...

最新文章

  1. PHP 利用PHPExcel到处数据到Excel;还有导出数据乱码的解决方案。
  2. 解决Chrome浏览器启动速度慢的问题
  3. HDU 3555 Bomb (数位DP-记忆化搜索模板)
  4. Java虚拟机学习(7):对象内存分配与回收
  5. python生成多维数组方法总结(多维创建有问题的情况)
  6. leetcode 496, 503, 556. Next Greater Element I, II, III | 496, 503, 556. 下一个更大元素 I,II,III(单调栈)
  7. 常用的两种spring、mybatis 配置方式
  8. php数组函数(分类基本数组函数,栈函数,队列)
  9. 如何对Javascript代码进行二次压缩(混淆)
  10. java访问权限修饰符从大到小_程序员的术与道:道——Java修饰符之非访问控制修饰符...
  11. Web of science(WOS)引文跟踪
  12. SQL Server 2008文件与文件组的关系
  13. win32api之添加水印
  14. VC++ 源码实现通达信公式管理器2
  15. 泛函分析 04.04 有界线性算子 - 开映射定理与逆算子定理
  16. 小米 12S Utra 莱卡水印生成在线工具
  17. 计算机u盘病毒清除方式,清除文件夹exe病毒方法
  18. NYOJ - 独木舟上的旅行
  19. 二分法求根号二的近似值_根号2约等于多少?
  20. 当编辑内容改变是后 选中内容 Range 的startOffset会被重置

热门文章

  1. 2023 车险计算器微信小程序源码
  2. 构建开放的软件团队文化
  3. 使用Qt实现一个图像处理软件0
  4. HDU-1546 dijkstra
  5. Docker篇之docker容器之间的通信
  6. html解析json天气预报数据,国家气象局天气预报JSON数据接口详解
  7. 天翼云赋能智慧农业 新农人迎来好收成
  8. 计算机无法开机 警报器在响,按下开机键以后报警器一直滴滴滴的响,而且电脑开启不了,响了一段时...
  9. 单文件php在线压缩,解压工具
  10. macOS使用C/C++万能头文件保姆级教程