独特"价值" MySQL数据库问题

时间:2014-03-20 18:40:27

标签: php mysql database insert

我的MySQL数据库存在一个小问题。

我有一个字段StudentID,它应该对每个用户都是唯一的,但不是强制性的。

因此,当用户注册并且不想添加studentID时 - 他将该字段留空。但是,当第二个用户将该字段留空时 - 它将其计为重复值。

有没有办法解决这个问题?我尝试了下面发布的几种方法:

  

Mysql错误:1062 - 重复输入''为了钥匙   ' users_studentid_unique'

第一次(工作):

insert into `users` (`username`, `name`, `email`, `studentid`, 
                     `password`, `updated_at`, `created_at`) 
values ('aaaaaa263', 'aaaaaa', 'aaaaaa23d@gmail.com','' ,
        'yZPeKRV0C0xbr/QCI1w/Y.0Z1qSGnJeivgP71epaHpT139g65hAf2', 
        '2014-03-20 18:16:54', '2014-03-20 18:16:54')

第二次(studentid的重复值错误):

insert into `users` (`username`, `name`, `email`, `studentid`,
                     `password`, `updated_at`, `created_at`) 
values ('aaaaaa263', 'aaaaaa', 'aaaaaa23d@gmail.com','' ,
        'yZPeKRV0C0xbr/QCI1w/Y.0Z1qSGnJeivgP71epaHpT139g65hAf2', 
        '2014-03-20 18:16:54', '2014-03-20 18:16:54')

试过:

检查数据库中NULL表的studentid值。

尝试使用这些值而不是空白字段插入数据库:

NULL
null
UNDEFINED

但仍有同样的问题, - 有没有人知道如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

您可以将学生ID设置为时间戳,如果它为空,则检查其数字是否确实设置了。

<?php

$student_id = is_null($student_id) ? time() : $student_id;

您的要求:

insert into `users` (`username`, `name`, `email`, `studentid`, 
                     `password`, `updated_at`, `created_at`) 
values ('aaaaaa263', 'aaaaaa', 'aaaaaa23d@gmail.com','$student_id' ,
        'yZPeKRV0C0xbr/QCI1w/Y.0Z1qSGnJeivgP71epaHpT139g65hAf2', 
        '2014-03-20 18:16:54', '2014-03-20 18:16:54')

然后让用户回来:

SELECT *, if(concat('','student_id' * 1) = 'student_id', 0, 1) as is_student_id_valid from ...

然后is_studient_id_valid字段会告诉您此ID是否有效。

答案 1 :(得分:0)

使用NULL值,该值不被认为是&#34;重复&#34;在一个独特的索引。但该列必须允许NULL值,也就是说,它不能定义为NOT NULL

要插入NULL值,请使用关键字NULL关键字。请注意,这与字符串'NULL'

不同
INSERT INTO mytab (a, b) VALUES (NULL, 'NULL')

为a列分配了特殊的NULL值。列b被分配了一个字符串。

此外,省略INSERT列表中的列将导致将默认值分配给列。除非您将默认值设置为其他值,否则列的默认值为NULL。

此语句等同于上述语句,在该列中将为a列分配为a列定义的默认值,即

 INSERT INTO mytab (b) VALUES ('NULL')

另一个选项是使用表达式为您生成NULL值,代替空字符串。

鉴于您当前逻辑的描述,如果user_id列允许NULL值,那么您可以将空字符串转换为NULL

insert into `users` (`username`, `name`, `email`, `studentid`,
                     `password`, `updated_at`, `created_at`) 
values ( ?, ?, ?, NULLIF( ? ,''), ?, ?, ?)

NULLIF(x,y)函数是IF x = y THEN NULL ELSE x END的缩写。

答案 2 :(得分:0)

我试图重新创建你的问题。唉,这里工作正常。

但是,我提供所有信息,以便您至少可以检查设置的不同之处。

创建表语句:请检查所有:Mysql版本,表引擎,主键和&#39; studentid&#39;列。

/*
SQLyog Community v10.2 
MySQL - 5.5.16 : Database - testmysql
*********************************************************************
*/

/*Table structure for table `users` */

DROP TABLE IF EXISTS `users`;

CREATE TABLE `users` (
  `username` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `name` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `studentid` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL,
  `password` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`username`),
  UNIQUE KEY `studentid_uidx` (`studentid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

具有null studentid的典型插入...

INSERT INTO `users` (`username`, `name`, `email`, `studentid`,
                     `password`, `updated_at`, `created_at`) 
VALUES ('aaaaaa004', 'aaaaaa', 'aaaaaa23d@gmail.com', NULL,
        'yZPeKRV0C0xbr/QCI1w/Y.0Z1qSGnJeivgP71epaHpT139g65hAf2', 
        '2014-03-20 18:16:54', '2014-03-20 18:16:54')

查询结果

username    name    email                studentid  password    created_at  updated_at
aaaaaa001   aaaaaa  aaaaaa23d@gmail.com (NULL)  yZPeKRV0C0xbr/QCI1w/Y.0Z1qSGnJeivgP71epaHpT139g65hAf2   2014-03-20 18:16:54 2014-03-20 18:16:54
aaaaaa002   aaaaaa  aaaaaa23d@gmail.com (NULL)  yZPeKRV0C0xbr/QCI1w/Y.0Z1qSGnJeivgP71epaHpT139g65hAf2   2014-03-20 18:16:54 2014-03-20 18:16:54
aaaaaa003   aaaaaa  aaaaaa23d@gmail.com stid01  yZPeKRV0C0xbr/QCI1w/Y.0Z1qSGnJeivgP71epaHpT139g65hAf2   2014-03-20 18:16:54 2014-03-20 18:16:54
aaaaaa004   aaaaaa  aaaaaa23d@gmail.com (NULL)  yZPeKRV0C0xbr/QCI1w/Y.0Z1qSGnJeivgP71epaHpT139g65hAf2   2014-03-20 18:16:54 2014-03-20 18:16:54