Question

J'utilise base de données mysql. Je sais postgresql et le serveur SQL prend en charge l'indexation partielle. Dans mon cas, je veux faire quelque chose comme ceci:

CREATE UNIQUE INDEX myIndex ON myTable (myColumn) where myColumn <> 'myText'

Je veux créer une contrainte unique, mais il devrait permettre des doublons si elle est un texte particulier.

Je ne pouvais pas trouver un moyen de le faire directement dans une base MySQL. Mais, est-il une solution pour y parvenir?

Était-ce utile?

La solution

Je suppose qu'il n'y a qu'une seule façon d'y parvenir. Vous pouvez ajouter une colonne à votre table, créer un index sur et créer déclencheur ou faire insérer / mettre à jour dans vos procédures stockées pour remplir cette colonne en utilisant la condition suivante:

if value = 'myText' then put null
otherwise put value

it helps

Autres conseils

Les index filtrés peuvent être émulés avec des index de la fonction et l'expression de CASE (MySQL 8.0.13 et plus récent):

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 <> violon démo

Sortie:

+-----+----------+
| id  | myColumn |
+-----+----------+
|  1  | myText   |
|  2  | myText   |
|  3  | aaaaa    |
+-----+----------+
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top