【Mysql】Navicat数据导出和Mysql唯一约束的坑

本文讲述了在处理MySQL数据时遇到的一个问题,即使用Navicat导出CSV并尝试重新导入时,由于唯一约束和空值处理的差异导致导入失败。在故障排查后发现,MySQL的唯一约束在包含空值时可能会失效,而Navicat在导出CSV时将空值写为"",导入时变成空字符串,违反了唯一约束。解决方案是先将CSV中的空字符串设为NULL,再导入到目标表。
摘要由CSDN通过智能技术生成

一个简单的需求引发的问题

简单的需求

收到一个Mysql数据清理的需求,需要按照查询条件清理部分数据,按照操作规范:

  • 用Navicat(导出UTF8 CSV文件的方式)备份即将被清理的数据,记录数据量
  • 清理数据,核对数据量,没有问题

变更

后面需求变化,这部分数据不需要删除了,需要rollback,着手恢复数据

  • 用Navicat导入数据,报错:违反唯一约束
  • 核实库表变动,反馈表结构和数据都没做过后续变更
  • 利用 create table like 创建中间表导入数据,依然报相同错误

故障排查

  • 删除中间表唯一约束,数据可以正常导入,按照这个逻辑,当时导出数据的时候数据就违反唯一约束了,首先怀疑是否是Mysql唯一约束存在bug
  • 测试重复数据之后加唯一约束或者唯一约束之后插入重复数据都报错,说明问题可能出在数据本身
  • 核查重复数据,发现一个问题,现在已加唯一约束的表中也存在违反唯一约束的数据,但数据库没有报错

问题确定

  • 测试Mysql的唯一约束,发现其和sqlserver、ORACLE相比存在一个差异。当Mysql唯一约束的几个字段中存在空值的时候,唯一约束会失效。比如唯一约束为 ID+VALUES,对于values(1,NULL)这样的一条数据,在sqlserver中重复插入会报违反唯一约束,但Mysql不会报错(认为不违反唯一约束)。
  • Navicat查询结果导出为CSV后导入存在数据差异,因为选择了字符串分隔符,所以空值在CSV里面写入为”“,当导入时这个数据就成了一个空字符串,导致数据差异。

解决方式

  1. 将CSV导入中间表,然后将空字符串设为NULL
  2. 将数据从中间表导入目标表

后续

切换导出查询结果工具,

MySQL 是一种流行的开源关系型数据库管理系统,它可以通过多种方式来导出和导入数据Navicat 是一款常用的 MySQL 数据库管理工具,它提供了用户友好的界面和丰富的功能。 在 Navicat导出数据,首先需要在导航栏中选择相应的数据库连接,然后展开数据库列,选择要导出数据库。接下来,右键点击要导出数据,选择“导出”选项。在弹出的对话框中,选择导出的格式(如 SQL 文件、Excel 文件等)和文件路径,点击“确定”即可开始导出导出的文件将包含指定数据的结构和数据。 在 Navicat 中导入数据,同样需要选中要导入数据数据库连接。接着,右键点击数据库,选择“新建数据”选项。在弹出的界面中,可以手动创建数据的结构,也可以选择使用已存在的结构文件或从 CSV 文件中导入数据。如果选择使用已存在的结构文件,可以浏览文件并选择需要导入的结构文件。如果选择从 CSV 文件导入数据,则需要浏览并选择对应的 CSV 文件,并指定导入选项(如字段分隔符、行分隔符等)。最后,点击“确定”即可开始导入数据。 总结而言,Navicat 是一个功能强大且易于使用的工具,可以方便地导出和导入 MySQL 数据。通过简单的几步操作,用户可以轻松地导出指定数据的结构和数据,以及导入已有的结构文件或从 CSV 文件中导入数据。这些功能的使用可以大大提高数据库管理的效率和便利性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值