10

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

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

主表是用 larave 模式构建器类生成的

$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 字段。

4

2 回答 2

11

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

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

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

public function setEmailAttribute($value) {
    if ( empty($value) ) { // will check for empty string
    $this->attributes['email'] = NULL;
    } else {
        $this->attributes['email'] = $value;
    }
}
于 2016-01-30T11:33:17.690 回答
0

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

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

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

于 2020-12-21T13:42:35.427 回答