如何在mysql(laravel)中使varchar可为空且唯一

Posted

技术标签:

【中文标题】如何在mysql(laravel)中使varchar可为空且唯一【英文标题】:how to make a varchar nullable and unique together in mysql (laravel) 【发布时间】:2013-06-18 23:01:36 【问题描述】:

我可以将 mysql 列设为可空且唯一吗?如果用户想要提供,我有一个存储用户 Email_id 的表,否则它将是(null)。我读到其他一些问题,我可以使用默认 NULL 创建一个唯一字段。但是创建表时出现此错误

#1067 - Invalid default value for 'email' (i make it only for test purpose)

主表是用 larave schema builder 类生成的

$table->text('email')->nullable()->unique(); (no default added)

在数据库中

+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+ 
| email_id     | varchar(200)     | YES  | UNI | NULL    |                |

现在错误是

Duplicate entry '' for key 'users_email_id_unique' (when inserting email with empty string) 

现在的问题是如何处理唯一且可以一起为空的 varchar 字段。

【问题讨论】:

【参考方案1】:

我们只是在必须插入 null 时犯了一个错误。如果是 null,我们必须像这样声明 null:

if(empty($request->email_id))
    $user->email_id = NULL;

不要使用“NULL”,这将被视为字符串。

【讨论】:

【参考方案2】:

我知道这是一个老问题,这是为其他有同样问题的人准备的。

您正在尝试添加 empty 字符串。您使列可为空唯一。这意味着你正在尝试一些你不应该做的事情。您可以发送多个 null 值,但不能发送多个 empty 字符串。 MySQL 将 empty 视为一个值。

或者你可以在你的模态中写一个mutator

public function setEmailAttribute($value) 
    if ( empty($value) )  // will check for empty string
    $this->attributes['email'] = NULL;
     else 
        $this->attributes['email'] = $value;
    

【讨论】:

以上是关于如何在mysql(laravel)中使varchar可为空且唯一的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 查询生成器中使隐藏属性可见?

如何在 Laravel 中使非数据库模型具有两个属性

在 Laravel 5 迁移中使列不可为空

如何在 PHPMyAdmin 中使 MySql 中的字段自动递增?

如何在 MySQL Workbench 中使默认 blob 成为图像?

如何在mysql中使innoDB表中varchar字段总长度超过65535,是否可以修改某个mysql的配置参数。