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就能够看到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创建唯一索引,避免数据重复插入
多台服务器使用一个数据库时,有时就会出现重复插入的情况,eg:people表中的姓名和身份证号 此时可以给姓名和身份证号创建唯一索引, 创建语句:alter table people add uniq ...
- MySQL 创建唯一索引忽略对已经重复数据的检查
MySQL 创建唯一索引忽略对已经重复数据的检查 在创建唯一索引的基础上加上关键字"IGNORE "即可.(注意,经测试,在5.7版本已经不再支持该参数) # 重复数据 mysql ...
- MySQL之唯一索引、外键的变种、SQL语句数据行操作补充
0.唯一索引 unique对num进行唯一限制,表示num是独一无二的,uql是唯一索引名称 上面为联合索引:num和xx不能完全一样 1.外键的变种 a. 用户表和部门表 用户: 1 alex 1 ...
- mysql的唯一索引UNIQUE
创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复.唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值.如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的 ...
- mysql创建唯一索引
查看索引 show index from 数据库表名 alter table 数据库add index 索引名称(数据库字段名称) PRIMARY KEY(主键索引) ALTER TABLE `ta ...
- mysql删除唯一索引
在项目中用spring data jpa指定了一个唯一索引: @Entity @Table(name = "t_product") @Getter @Setter @AllArgs ...
- mysql创建唯一索引UNIQUE INDEX,以及报错“#失败原因: [Execute: Duplicate entry '733186700' for key 'uniq_video_id_index']”
要给t_video_prods表的video_id字段创建唯一所以,可以使用下面这条语句: alter table t_video_prods add UNIQUE INDEX `uniq_video ...
- MYSQL INSERT INTO SELECT 不插入重复数据
INSERT INTO `b_common_member_count` (uid) SELECT uid FROM `b_common_member` WHERE uid NOT IN (SELECT ...
- MySQL添加唯一索引
1 语法如下 ALTER TABLE `t_user` ADD unique(`username`);
随机推荐
- Linux内核 结构 struct urb
struct urb 结构中和 USB 设备驱动有关的成员是: struct usb_device *dev 指向这个 urb 要发送到的 struct usb_device 的指针. 这个变量必须被 ...
- The Zen of Python —— Python 之禅
Beautiful is better than ugly. # 优美好于丑陋(Python以编写优美的代码为目标) Explicit is better than implicit. # 明 ...
- CString::CompareNoCase与CString::Compare的区别
转载:https://blog.csdn.net/lingdxuyan/article/details/4362116 函数原型:int CompareNoCase( LPCTSTR lpsz ) c ...
- STVD、IAR两种编译器比较
1.全局查找功能: STVD:全局查找功能全局查找功能比较麻烦,有3个动作. IAR:有全局查找功能比较方便,只要一个动作,和KEIL一样. 2.编译时间 STVD:相对比较慢. IAR:相对快点. ...
- eclipse中如何配置maven
1.首先需要在自己电脑中安装Maven,下载maven的路径:http://maven.apache.org/download.cgi 2.我们把下载好的文件解压到自己电脑的任意一个盘符中去,我的是e ...
- CPP STL学习笔记
STL的概念 源地址 https://www.ev0l.art/index.php/archives/15/ <li> Iterator (迭代器)<li> Containe ...
- SofaBoot使用Nacos进行服务注册发现
前提 最近创业公司的项目组基于业务需要,开发一套新的微服务,考虑到选用的组件必须是主流.社区活跃.生态完善以及方便迁移到云上等因素,引入了SOFAStack全家桶.微服务开发里面,一个很重要的功能就是 ...
- $NOIp$提高组历年题目复习
写在前面 一个简略的\(NOIp\)题高组历年题目复习记录.大部分都有单独写题解,但懒得放\(link\)了\(QwQ\).对于想的时候兜了圈子的题打上\(*\). \(NOIp2018\ [4/6] ...
- 30.strftime参数
附:strftime参数 strftime(format[, tuple]) -> string 将指定的struct_time(默认为当前时间),根据指定的格式化字符串输出 python中时间 ...
- input值
input里面的值为字符串(string)类型,所以用作数的计算的时候需要用Number(mInput.value)进行转换成数值Numbei()类型才可以计算 例如: mInput1.value + ...