Solución alternativa en MySQL para índice parcial o índice filtrado?
-
25-10-2019 - |
Pregunta
Estoy usando mysql db. Sé que PostgreSQL y SQL Server admiten la indexación parcial. En mi caso quiero hacer algo como esto:
CREATE UNIQUE INDEX myIndex ON myTable (myColumn) where myColumn <> 'myText'
Quiero crear una restricción única, pero debería permitir duplicados si es un texto en particular.
No pude encontrar una forma directa de hacer esto en MySQL. Pero, ¿hay una solución para lograrlo?
Solución
Supongo que solo hay una forma de lograrlo. Puede agregar otra columna a su tabla, crear un índice y crear disparador o insertar/actualizar dentro de sus procedimientos almacenados para llenar esta columna utilizando la siguiente condición:
if value = 'myText' then put null
otherwise put value
Espero eso ayude
Otros consejos
Los índices filtrados podrían emularse con índices de funciones y CASE
Expresión (MySQL 8.0.13 y más nueva):
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;
Producción:
+-----+----------+
| id | myColumn |
+-----+----------+
| 1 | myText |
| 2 | myText |
| 3 | aaaaa |
+-----+----------+
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow