Пространственный индекс по сгенерированному (виртуальному / сохраненному) столбцу? - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть сгенерированный (storedAs) столбец в моей базе данных Laravel, который принимает два decimal столбца lat и lng и возвращает point геопространственный тип. Я использую сгенерированный столбец, чтобы избежать сценария, в котором столбцы десятичной широты / ширины каким-либо образом обновляются, а столбец пространственной ширины - нет (или наоборот).

Я также хотел бы проиндексировать этот столбец, чтобы выполнить быстрый поиск, но натолкнулся на небольшую заминку. Я использую построитель миграции Laravel для генерации схемы таблицы. Хотя исходные столбцы не обнуляются и по умолчанию 0, он не будет работать, если я также добавлю пространственный индекс, поскольку все части должны быть не нулевыми. Я предполагаю, что «все части» относятся только к столбцу latlng.

Миграция ниже использует метод spatialIndex() из Grimzy's Laravel MySQL Пространственное расширение , но я не думаю, что это проблема, так как стандартный класс Laravel Blueprint также возвращает тот же результат.

public function up()
{
    Schema::table('locations', function (Blueprint $table) {
        $table->decimal('lat', 8, 6)->default(0);
        $table->decimal('lng', 9, 6)->default(0);
        $table->point('latlng')->storedAs('POINT(lat, lng)');
        $table->spatialIndex('latlng');
    });
}

При миграции:

Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1252 All parts of a SPATIAL index must be NOT NULL (SQL: alter table `locations` add spatial `locations_latlng_spatial`(`latlng`))

Мое единственное предположение является то, что MySQL не поддерживает пространственные индексы для сгенерированных столбцов. Или я что-то не так делаю?

ОБНОВЛЕНИЕ: кажется, я использую MariaDB, а не MySQL, который в настоящее время их не поддерживает.

...