Как мне создать уникальный составной индекс в Laravel 6? - PullRequest
0 голосов
/ 21 февраля 2020

Я новичок в Laravel и использую Laravel 6. Я пытаюсь создать уникальный составной индекс для двух столбцов моей таблицы MySQL, но когда я запускаю миграцию, я получаю эту ошибку:

Подсветка \ База данных \ QueryException: SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1071 Указанный ключ слишком длинный; максимальная длина ключа составляет 767 байт (SQL: изменить таблицу sleep_diary_entries добавить индекс primaryKey (client, sleep_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 символов.

Этот индекс жизненно важен для правильной работы моего приложения: комбинация идентификатора пользователя и даты в индексе гарантирует, что пользователь может создавать только одну запись для каждого дня.

Как мне уговорить Laravel принять мой индекс?

Кроме того, в документах не совсем ясно, может ли составной индекс быть уникальным или

table-> unique (['client', 'sleep_date']);

допустимо или если unique () может быть применено только к одному столбцу. Мне нужно, чтобы мой составной индекс был уникальным.

РЕДАКТИРОВАТЬ: Как только я добавил строку, предложенную Sehdev для AppServiceProvider. php, я смог успешно создать свой индекс, как показано в моем вопросе. Однако методом проб и ошибок я быстро убедился, что индекс НЕ уникален и позволил бы данному пользователю добавлять несколько записей для каждой даты в соответствии с потребностями моего приложения. Я изменил определение на:

table-> unique (['client', 'sleep_date'], 'UniqueKey');

На этот раз индекс был одновременно составным и уникальным, как я и хотел.

Я все еще озадачен тем, что эти два столбца имеют общую длину более 757 байт, но у меня нет времени на это зацикливаться; Я хочу работать над моим приложением.

1 Ответ

2 голосов
/ 21 февраля 2020

Эта проблема уже указана в Laravel git хранилище здесь

MySQL определяет строку как VARCHAR (255)

Чтобы решить эту проблему:

1.Goto app/Providers/AppServiceProvider.php

Добавьте следующие строки:
use Illuminate\Support\Facades\Schema; // use this class

public function boot()
{
    Schema::defaultStringLength(191); // add this line in boot method
}

ИЛИ

Вручную измените VARCHAR(255) на VARCHAR(191) и попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...