mysql联合主键的坑

坑一 字符类型区分大小问题

问题: 如果联合主键报类似下面错误:

MySQLIntegrityConstraintViolationException: Duplicate entry '186699-1-malu8070' for key 'PRIMARY'

分析: 可能是有两条大小写不一致的数据,插入时联合主键忽略大小写,认为这两条数据ID重复,所以会报Duplicate entry
例如:186699-1-malu8070 是由三个字段组成的联合主键,该条数据各字段分别对应的值为:186699 1 malu8070 ,前两个字段为int类型,不予考虑,第三个字段为varchar类型,如果没有为该varchar字段设置排序规则,则默认会忽略大小写。所以如下两条数据186699-1-malu8070186699-1-Malu8070 在插入时认为是一个主键,所以报Duplicate entry
``

解决:
1、 设置该varchar字段字符集为:*_bin 或者 *_cs

  • 例如:
contact_num` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '联系方式号码'
  • 说明:
    – utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。
    – utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。
    – utf8_general_cs区分大小写,cs为case sensitive的缩写,即大小写敏感。

2、 创建字段指定binary。

  • 例如:
contact_num` varchar(20)  binary  NOT NULL DEFAULT '' COMMENT '联系方式号码'

坑二 字符串前后空格问题

问题: 186699-1-malu8070186699-1-malu8070(后面有个空格),在插入时mysql认为是一条数据,也会报Duplicate entry '186699-1-malu8070 ' for key 'PRIMARY' 这种错误
分析: mysql默认对字符串前后空格忽略,即联合主键186699-1-malu8070186699-1-malu8070(后面有个空格)认为是一个主键,所以会报Duplicate entry
解决: 在插入前进行trim()处理去除前后空格,然后判断是否相等,相等不执行重复插入操作。

注意:

  • 查询和插入一样存在上述两种问题
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值