如何在Laravel 6中创建唯一的综合索引?

如何在Laravel 6中创建唯一的综合索引?,laravel,Laravel,我对Laravel是新手,正在使用Laravel 6。我试图在MySQL表的两列上创建一个唯一的复合索引,但在运行迁移时,出现以下错误: Illumb\Database\QueryException:SQLSTATE[42000]:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为767字节(SQL:alter tablesleep\u dialog\u entriesaddindexprimaryKey(client,sleep\u date) 医生说我写的陈述是正确的。以下是表格定义

我对Laravel是新手,正在使用Laravel 6。我试图在MySQL表的两列上创建一个唯一的复合索引,但在运行迁移时,出现以下错误:

Illumb\Database\QueryException:SQLSTATE[42000]:语法错误或访问冲突:1071指定的密钥太长;最大密钥长度为767字节(SQL:alter table
sleep\u dialog\u entries
addindex
primaryKey
client
sleep\u date

医生说我写的陈述是正确的。以下是表格定义的相关行:

       Schema::create('sleep_diary_entries', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('client');
        $table->date('sleep_date');
        $table->index(['client', 'sleep_date'], 'primaryKey'); //combination of client and sleep_date must be unique
MySQL将一个字符串定义为VARCHAR(255),日期应该是大约10个字符(给定或接受)。我不明白这个综合索引怎么会超过767个字符

这个索引对于让我的应用程序正常运行至关重要:索引中用户id和日期的组合确保用户每天只能创建一条记录

我如何说服拉威尔接受我的索引

此外,对于复合索引是否可以是唯一的,或者是否可以是唯一的,文档一点也不清楚

表->唯一(['client','sleep_date'])

是有效的,或者如果unique()只能应用于单个列。我需要我的复合索引是唯一的

编辑:一旦我将Sehdev建议的行添加到AppServiceProvider.php,我就能够成功地创建索引,如我的问题所示。然而,通过反复试验,我很快验证了索引不是唯一的,并且允许给定用户根据我的应用程序的需要为每个日期添加多个记录。我将定义更改为:

表->唯一(['client','sleep_date','UniqueKey')

这一次,索引是复合的和唯一的,这正是我想要的


我仍然困惑于这两列的总长度是如何被认为大于757字节的,但我没有时间去纠缠它;我想使用我的应用程序

此问题已在Laravel git存储库中列出

MySQL将字符串定义为VARCHAR(255)

要解决这个问题:

1.Goto
app/Providers/AppServiceProvider.php

  • 添加以下行:

  • 手动将
    VARCHAR(255)
    更改为
    VARCHAR(191)
    ,然后重试。

    此问题已在Laravel git存储库中列出

    MySQL将字符串定义为VARCHAR(255)

    要解决这个问题:

    1.Goto
    app/Providers/AppServiceProvider.php

  • 添加以下行:

  • 手动将
    VARCHAR(255)
    更改为
    VARCHAR(191)
    ,然后重试。

    简言之:Laravel>=5.4默认使用
    utf8mb4
    字符集,而Mysql简言之:Laravel>=5.4默认使用
    utf8mb4
    字符集,而Mysql
    use Illuminate\Support\Facades\Schema; // use this class
    
    public function boot()
    {
        Schema::defaultStringLength(191); // add this line in boot method
    }