如何在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可为空且唯一的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PHPMyAdmin 中使 MySql 中的字段自动递增?