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?

¿Fue útil?

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;

DB <> Demo de violín

Producción:

+-----+----------+
| id  | myColumn |
+-----+----------+
|  1  | myText   |
|  2  | myText   |
|  3  | aaaaa    |
+-----+----------+
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top