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

MySql 码拜 8年前 (2016-02-21) 1136次浏览
为什么能写入重复数据呢?在存在唯一索引前提下。请高手帮忙解惑,谢谢
唯一索引: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)