Обходной путь в MySQL для частичного индекса или отфильтрованного индекса?
-
25-10-2019 - |
Вопрос
Я использую MySQL DB. Я знаю, что PostgreSQL и SQL Server поддерживает частичную индексацию. В моем случае я хочу сделать что -то вроде этого:
CREATE UNIQUE INDEX myIndex ON myTable (myColumn) where myColumn <> 'myText'
Я хочу создать уникальное ограничение, но оно должно разрешить дубликаты, если это конкретный текст.
Я не мог найти прямой способ сделать это в MySQL. Но есть ли обходной путь для его достижения?
Решение
Я полагаю, есть только один способ достичь этого. Вы можете добавить еще один столбец в свою таблицу, создать индекс на нем и создать триггер или вставить/обновить в свои хранимые процедуры, чтобы заполнить этот столбец, используя следующее условие:
if value = 'myText' then put null
otherwise put value
Надеюсь, поможет
Другие советы
Фильтрованные индексы могут быть инициированы с помощью функциональных индексов и CASE
выражение (MySQL 8.0.13 и новее):
CREATE TABLE t(id INT PRIMARY KEY, myColumn VARCHAR(100));
-- NULL are not taken into account with `UNIQUE` indexes
CREATE UNIQUE INDEX myIndex ON t((CASE WHEN myColumn <> 'myText' THEN myColumn END));
-- inserting excluded value twice
INSERT INTO t(id, myColumn) VALUES(1, 'myText'), (2, 'myText');
-- trying to insert different value than excluded twice
INSERT INTO t(id, myColumn) VALUES(3, 'aaaaa');
INSERT INTO t(id, myColumn) VALUES(4, 'aaaaa');
-- Duplicate entry 'aaaaa' for key 'myIndex'
SELECT * FROM t;
Выход:
+-----+----------+
| id | myColumn |
+-----+----------+
| 1 | myText |
| 2 | myText |
| 3 | aaaaa |
+-----+----------+