• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > MySQL批量插入遇上唯一索引避免方法

MySQL批量插入遇上唯一索引避免方法

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了mysql 唯一索引,mysql删除唯一索引,mysql创建唯一索引,mysql 联合唯一索引,mysql添加唯一索引等相关知识,希望本文的分享对您有所帮助

一、背景

以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表分区实战。

今天我们来了解MySQL唯一索引的一些知识:包括如何创建,如何批量插入,还有一些技巧上SQL;

这些问题的根源在什么地方?有什么共同点?MySQL中也有分区对齐的概念?唯一索引是在很多系统中都会出现的要求,有什么办法可以避免?它对性能的影响有多大?

二、过程

(一) 导入差异数据,忽略重复数据,IGNORE INTO的使用

在MySQL创建表的时候,我们通常创建一个表的时候是以一个自增ID值作为主键,那么MySQL就会以PRIMARY KEY作为聚集索引键和主键,既然是主键,那当然是唯一的了,所以重复执行下面的插入语句会报1062错误:如Figure1所示;

u1_1062

(Figure1:Duplicate entry '1' for key 'PRIMARY')

但是在实际的生产环境中,需求往往是需要在UserId键值中设置唯一索引,今天我就以这个作为示例,进行唯一索引的测试:

u2_table1

(Figure2:testtable1记录)

u3_table2

(Figure3:testtable2记录)

通过执行上面的SQL脚本,我们在testtable1和testtable2都创建了唯一索引:UNIQUE KEY `IX_UserId` (`UserId`),这就说明UserId在testtable1和testtable2表中都是唯一的,如果把testtable2的数据批量导入到testtable1,如果执行下面【导入1】的SQL,就会出现1062的错误,导致整个过程会回滚,没有达到导入差异数据的目的。

u4_unique

(Figure4:Duplicate entry '101' for key 'IX_UserId')

MySQL提供一个关键字:IGNORE,这个关键字判断每条记录是否存在,是否违反饿了表中的唯一索引,如果存在就不插入,而不存在的记录就会插入。

u5_效果

(Figure5:IGNORE效果)

(二) 导入并覆盖重复数据,REPLACE INTO 的使用

1. 把testtable1和testtable2分别回滚到Figure2和Figure3的状态(使用TRUNCATE TABLE命名再执行Insert语句),这个时候再执行下面的SQL,看有什么效果:
</div>

(Figure6:REPLACE效果)

从上图Figure6中,我们可以看到:UserId为101的记录发生了改变,不单UserName修改了,而且UserType也变为NULL了。

所以,如果导入中发现了重复的,先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空(新插入记录的UserType都为NULL)。

需要注意的是,当你replace的时候,如果被插入的表如果没有指定列,会用NULL表示,而不是这个表原来的内容。如果插入的内容列和被插入的表列一样,则不会出现NULL。

2. 如果我们表结构UserType字段不允许为空,而且没有默认值的情况,执行【导入3】会发生什么事情呢?

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • MySQL批量插入遇上唯一索引避免方法
  • mysql下普通索引和唯一索引的效率对比

相关文章

  • 2017-05-11mysql 无法连接问题的定位和修复过程分享
  • 2017-05-11mysqli预处理编译的深入理解
  • 2017-05-11MySQL学习笔记3:表的基本操作介绍
  • 2018-12-05Access使用宏控制程序之创建宏组
  • 2018-12-05mysql + Fluently NHibernate + WebAPI + Autofac
  • 2017-05-11MySQL 的CASE WHEN 语句使用说明
  • 2017-05-11MySQL 最基本的SQL语法/语句
  • 2018-12-05MySQL不支持InnoDB的解决方法
  • 2018-12-05关于mysql5.7以上版本下载及安装的详细介绍(图文)
  • 2018-12-05SQLServer 全文检索(full-text)语法

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • MySql修改数据库编码为UTF8避免造成乱码问题
    • 有关Analyse的文章推荐10篇
    • MySQL中常用存储引擎有哪些?它们相互之间有什么区别?
    • mysql 日期和时间函数
    • mysqld_multi部署单机详解
    • MySql常用操作SQL语句汇总
    • MySQL查询语句之复杂查询
    • MySQL字符串函数:字符串截取
    • Access数据库提示OleDbException (0x80004005): 操作必须使用一
    • oracle 声明游标(不具备字段)规则应用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有