mysql中某个字段出现重复数据,但该字段定义了唯一索引,not null ;不应出现这种情况,什么原因造成的?

1.表结构如图(第一二张),只有user_name(账户名称)和role_type(用户-理发师)定义了唯一性索引和not null ;2.但出现了重复数据第三张图片(同样的手机号,第一行是以用户身份role_type注册,对应余额为0.00;第二行是以理发师的身份注册,对应余额为73064.00)要是这样的话,那你告诉我返回的余额是0,还是73064呢?3.要求:要么返回余额,要么返回空4.最后要求用代码进行验证,针对这个用户,是给空还是余额(给个思路就行)5.可能有的人会想,有重复的删掉不就行了;但往往实际业务情况不能删掉他们-----------------------------------------------------------------现在刚学习mysql, 琢磨了很久,以下是我的思路1,先看表结构2.user_name和role_type 定义了唯一性索引,为什么还有重复的数据? 1>我试着往这两个字段插入重复数据,提示因唯一约束不能插入 那我又想,是之前已经存入数据?因某些业务原因需要修改了表结构,造成这种情况? 还是其他什么原因? 2>现在纠结于它为什么有重复数据;怎么在唯一约束加not null 下插入重复的数据(还不 报错) 有几种情况:1.定义索引之前插入重复数据,再定义约束条件(相对不可能) 2.定义唯一索引没加not null 时,意外插入重复数据,然后才加了 not null约束(不知道有没有这种情况) 3.定义约束条件后意外插入数据(绝对不可能)3.解释下是什么原因造成这样的情况4.(非常重要)代码进行验证给个思路呗, 大神们!!!! 我的思路是:用户登录的时候,根据账户名称到数据库里查询,判断它是否大于1,是的 话就证明该账户违反规则,返回空 各位看我的思路有没有问题,能否实现,不能实现提出原因,怎么解决,谢谢
是这样,一,一个人以两个身份注册(1_普通用户,2_理发师)
二,既然以两个身份注册肯定对应不同的金额
主键 账户名称 注册身份 金额
char varchar varchar duble

id username rol_type money
a1 18235953658 1 0.00
a1 18235953658 2 5622.00
我想要通过账户名称,查找金额,你告诉我查出来的是0.00还是5622
要求用sql语句,返回结果要么是空,要么是5622

第1个回答  2018-01-03
CREATE TABLE `djzc`.`sys_user` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `user_name` VARCHAR(50) NOT NULL,
  `password` VARCHAR(300) NOT NULL,
  `real_name` VARCHAR(200) NULL,
  `nick_name` VARCHAR(200) NULL,
  `img_path` VARCHAR(200) NULL,
  `sex` INT NULL COMMENT '我认为应该用gender这个来表示性别的,不过sex,更符合国人口味',
  `card_no` VARCHAR(20) NULL,
  `birthday` VARCHAR(100) NULL,
  `address` VARCHAR(1000) NULL,
  `telephone` VARCHAR(50) NOT NULL,
  `email` VARCHAR(200) NULL,
  `status` INT NOT NULL DEFAULT 1,
  `reg_type` INT NOT NULL DEFAULT 1,
  `score` INT NOT NULL DEFAULT 0,
  `Invitation_code` VARCHAR(100) NOT NULL,
  `beInviter_code` VARCHAR(100) NULL,
  `level` INT NOT NULL DEFAULT 1,
  `role_type` INT NOT NULL DEFAULT 1,
  `money` DOUBLE NOT NULL DEFAULT 0.00,
  `red_money` DECIMAL(50,2) NOT NULL DEFAULT 0.00,
  `satisfaction` DECIMAL(50,2) NOT NULL DEFAULT 0.00,
  `reservation_count` INT NOT NULL DEFAULT 0,
  `pay_pwd` VARCHAR(100) NULL,
  `working` INT NOT NULL DEFAULT 2,
  `remark` VARCHAR(500) NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `telephone_UNIQUE` (`telephone` ASC),
  UNIQUE INDEX `email_UNIQUE` (`email` ASC))ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ;

首先我给你指出并修改了创建表的一些小纰漏。

作为一张表的id不应该使用char,而应该使用int,并且使用自增。这样的好处就是,你的id不会重复。也不用自己去赋值。其次,不仅仅手机号码需要用unique定义,email也需要用unique定义。

然后定义了unique 唯一的字段是无法重复添加的,即便是已经添加了重复的字段,在修改为unique的时候也会报错的,因此,建议你使用desc sys_user; 来看一下表结构,并提交追问方便后续判断问题所在。

追问

是这样,一个人以两个身份注册(1_普通用户,2_理发师)
二,既然以两个身份注册肯定对应不同的金额

第2个回答  2017-12-30
主键必须确保最少性和稳定性。 一个表只能有一个主键,它约束了表中的行是唯一的。主键一般情况下还是标识列,可以自动增长,所以最好是int型。而字段却不能达到这个要求。 所以仁兄,还是让他尘归尘,土归土吧追问

没有其他的解决办法吗,我相信肯定有的。前辈您能在仔细帮我看看,还有什么提议或解决的办法吗

相似回答