MariaDB функциональный индекс - PullRequest
2 голосов
/ 20 января 2020

Я пытаюсь определить следующую таблицу:

CREATE TABLE IF NOT EXISTS `test` (
  `gid` INT NOT NULL,
  `x` INT NOT NULL,
  `y` INT NOT NULL,
  `z` INT NOT NULL,
  `type` INT NOT NULL,
  ...
  PRIMARY KEY ( `gid`, `x`, `y`, `z` ),
  UNIQUE INDEX `type_index` ( `gid`, ( CASE WHEN `type` = 1 THEN `type` END ) ),
  UNIQUE INDEX `tp_index` ( `gid`, ( CASE WHEN `type` = 2 THEN ... END ) ),
);

Я хочу, чтобы таблица допускала только одну запись на gid, когда type равно 1, тогда как в ней может быть несколько записей за gid для любого другого типа . В MySQL этот запрос работает нормально. Однако при использовании MariaDB запрос вообще не работает.

Результат в MariaDB:

В синтаксисе SQL возникла ошибка; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с '(CASE WHEN type = 1 THEN type END)), UNIQUE INDEX tppad (gid, (CASE' в строке 1)

Как я могу решить эту ошибку?

Другими словами: что эквивалентно MariaDB этому?

Я использую версию 10.2.20-MariaDB-10.2.20+maria~xenial-log

1 Ответ

1 голос
/ 20 января 2020

Использовать сгенерированный столбец:

type_is_1 boolean generated always as (case when type = 1 then 1 end),
type_is_2 boolean generated always as (case when type = 2 then 1 end),
UNIQUE INDEX type_index ( gid, type_is_1 ),
UNIQUE INDEX tp_index ( gid, type_is_2 )

То есть MariaDB не допускает выражения в качестве ключей индекса. Но вы можете легко обойти это, используя сгенерированные столбцы.

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