mysql建表设置unique的注意事项

背景介绍

在项目中,实际遇到一个问题。随着业务的进行,这边要求对多个产品进行统一登陆接口的功能,这边需要将用户信息表导入SSO中的用户信息中。
实际在导入中发现频繁的报错:ERROR 1062 (23000) at line 1: Duplicate entry 'xxx@qq.com' for key 'service_id'
实际通过vim去查询,发现存在这样两条数据,导致信息插入报错:

sql结果.png

分析问题

查看了原有的库,这边确实存在两条数据,但是唯一的不同就是这个qq这两个字符是不同的。分析了两个库的建表语句。


新建数据库.png

旧的数据库.png

通过导出建表语句可以看出,原来的CloudUser表中,对service_id来说,采用的校对集为'utf8_bin',这个是对大小写敏感的。而新建的表中没有这个限定,默认是大小写不敏感的,所以出现上面报错的那个问题。

解决方案

mysql官方文档.png

从mysql的官方文档看:对于非二进制类型的串,如CHAR、VARCHAR、TEXT,其实是大小写不敏感的。所以,这里需要和旧库一样进行处理,将新库的那个service_id的字符类型调整成BINARY、VARBINARY、BLOB,ALTER TABLECloudUserMODIFY COLUMNservice_idVARCHAR(128) BINARY;或者如下修改新表ALTER TABLE CloudUser MODIFY service_id varchar(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL UNIQUE;

参考文献

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,208评论 0 13
  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 3,499评论 1 24
  • 我最想实现的一个目标是:成功生育福慧双全龙凤胎 所以我的咖啡冥想内容是: (与目标相对应的种子行动) 1.昨天下午...
    楚楚_心相印阅读 309评论 0 1
  • 三 船家 越过护城河的边界就到了城市了,我抬头看看头顶上火辣辣的日头,估摸着大概到了晌午的样子,若不是...
    怀道迷邦阅读 284评论 0 1
  • 今天正和朋友讨论遇到问题该不该发脾气,发脾气有什么好处和坏处,是否需要避免发脾气?…… 其实呢,人的情绪很多都是短...
    在装翅膀的猪阅读 83评论 0 2