【问题标题】:Unique "Value" Issue with MySQL databaseMySQL数据库的独特“价值”问题
【发布时间】:2014-03-20 18:40:27
【问题描述】:

我的 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')

第二次(学生ID重复值错误):

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 表上的NULL 值。

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

NULL
null
UNDEFINED

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

【问题讨论】:

  • 多个NULL 值不会违反UNIQUE 约束。但是,在 NOT NULL 列上指定 NULL 值可能会回退到其 DEFAULT 值:您的列是否可以为空?

标签: php mysql database insert


【解决方案1】:

使用NULL 值,这不会被视为唯一索引中的“重复”。但是该列必须允许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】:

    如果学生 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是否有效。

    【讨论】:

    • 我实际上是使用 php 脚本插入数据库,并且 studentID 字段在数据库中设置为 VARCHAR。
    【解决方案3】:

    我已尝试重现您的问题。唉,它在这里工作得很好。

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

    创建表语句:请检查所有:Mysql版本、表引擎、主键和'studentid'列的索引。

    /*
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多