【问题标题】:Duplicate entry '' for key 'users_email_unique' empty field键“users_email_unique”空字段的重复条目“”
【发布时间】:2015-08-13 09:22:28
【问题描述】:

我有两种类型的用户 - 真实的和虚假的。 假用户是不使用系统的员工。 真实用户使用他们的电子邮件地址登录。所以我的用户迁移有$table->string('email')->unique();

问题是假用户可能没有电子邮件地址。我可以添加第一个假用户没问题,但第二个会产生错误SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'users_email_unique'

我该怎么办?

【问题讨论】:

  • 将假用户插入为 NULL,这是因为 mysql 将 NULL 值视为 unqiue
  • 你为什么不做两张像tblrealUserstblfakeUsers这样的表?
  • 如果您要让多个用户使用“”电子邮件,则电子邮件字段不能是唯一的。你必须删除限制或使用任何“棘手”的解决方案,例如:“fakeXX@fake.com”是 XX 用户 ID。
  • @Mihai 真的吗?但它是如何工作的?
  • 如果您使用 orm,您应该希望与数据库无关,并且使用 null 不是一个好主意,原因有很多,首先是只有 mysql 是愚蠢的。从恩里克那里得到答案,让我忍住了 xD

标签: mysql laravel-4


【解决方案1】:

听起来users_email_unique 是您的主键。这意味着当您插入第一个带有空白电子邮件地址的假用户时,该空白条目将被视为唯一条目。当您输入第二个空白条目时,它违反了实体完整性(重复的主键)。

users_email_unique    unique?
_________________     _______
email@email.com       yes
blank                 yes
blank                 no

如果您想要多个空白条目,您可以允许 users_email_uniquenull,但是,主键列 cannot contain null values

users_email_unique   unique?
__________________   ________
email@email.com      yes
NULL                 yes
NULL                 yes

如果您使用 users_email_unique 作为主键,那么正如 cmets 中所指出的,您可能需要:

  • 为“假”用户临时生成一个随机的唯一电子邮件
  • 重新考虑表的主键(可能是某种形式的唯一 ID?)
  • 可能会分成两张表,一张用于“真实”用户,一张用于“假”

【讨论】:

  • 我选择了$table->dropUnique('email_users_unique');,但如果用户是假的并且没有提供他的电子邮件,我宁愿将电子邮件设置为NULL
  • @EdmundSulzanok 如果我尝试得到这个错误:` SQLSTATE[42000]:语法错误或访问冲突:1091 Can't DROP 'email_users_unique';检查列/键是否存在(SQL:alter table users drop index email_users_unique)`
  • @Hillcow 是否意味着您的电子邮件列已经不是唯一的?
【解决方案2】:

您可以通过两种方式采取行动:

  • 删除邮箱为空的那一行(如果有用户不是假的,这个过程会杀死他们的账户)
  • 给一个带有自定义域的随机电子邮件,例如random@myfakedomain.fake,然后您可以在登录时控制该邮件是否与假邮件匹配,并要求用户插入真实邮件如果他想插入继续使用该网站

(最终您可以先使用第二个解决方案,然后再传递给第一个)

【讨论】:

    【解决方案3】:

    对于可能在 2020 年寻找解决方案的任何其他人

    在 phpmyadmin 的 users 表 上查找这个 indexes

    删除 user_up_number_unique 索引可能会解决问题

    【讨论】:

      猜你喜欢
      • 2015-06-18
      • 2020-10-16
      • 2021-03-19
      • 2015-04-20
      • 2020-10-13
      • 1970-01-01
      • 2014-06-05
      • 2017-02-17
      • 2014-12-30
      相关资源
      最近更新 更多