我的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
但仍有同样的问题, - 有没有人知道如何解决这个问题?
答案 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