为什么创建了唯一索引,还能写入重复数据

MySql 码拜 9年前 (2015-10-19) 1936次浏览
在存在唯一索引前提下,为什么能写入重复数据呢?唯一索引:UNIQUE KEY `uwu` (`UserId`,`WeixinOpenid`,`UnionID`),
1:表结构信息如下:

CREATE TABLE `t_weixin` (

  `WeixinId` bigint(20) NOT NULL AUTO_INCREMENT,

  `MallId` bigint(20) DEFAULT NULL,

  `UserId` bigint(20) DEFAULT NULL,

  `RefereeUserId` bigint(20) DEFAULT NULL,

  `WeixinOpenid` varchar(100) NOT NULL,

  `Attentiontime` datetime DEFAULT NULL,

  `UnionID` varchar(100) NOT NULL,

  `HeadPic` varchar(255) DEFAULT NULL,

  `Nickname` varchar(100) DEFAULT NULL,

  `Type` int(1) DEFAULT NULL,

  `AppId` varchar(100) DEFAULT NULL,

  PRIMARY KEY (`WeixinId`),

  UNIQUE KEY `uwu` (`UserId`,`WeixinOpenid`,`UnionID`),

  KEY `FK_Reference_53` (`MallId`),

  KEY `FK_Reference_54` (`UserId`),

  KEY `FK_Reference_55` (`RefereeUserId`),

  CONSTRAINT `FK_Reference_53` FOREIGN KEY (`MallId`) REFERENCES `t_mall` (`MallId`),

  CONSTRAINT `FK_Reference_54` FOREIGN KEY (`UserId`) REFERENCES `t_user` (`UserId`),

  CONSTRAINT `FK_Reference_55` FOREIGN KEY (`RefereeUserId`) REFERENCES `t_user` (`UserId`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 
2: 为什么创建了唯一索引,还能写入重复数据

解决方案:10分
null不是。你可以将这个改为相同的试下
解决方案:30分

这里的问题是 unique 索引,允许列中有null值,而由于null值扫描也不是,所以null 和null 也是不同的。
所以你贴出来的数据中,由于userid两行都是null,所以这两行数据也是不同的。
如果你希望实现唯一的,那么只能用主键,但是你的表已经有一列自增的列,做成主键了,所以 userid DEFAULT NULL改成 
 userid DEFAULT xxx


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为什么创建了唯一索引,还能写入重复数据
喜欢 (0)
[1034331897@qq.com]
分享 (0)