Domanda

Sto usando db mysql. So PostgreSQL e SQL Server supporta l'indicizzazione parziale. Nel mio caso voglio fare qualcosa di simile:

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

Voglio creare un vincolo univoco, ma dovrebbe consentire duplicati se si tratta di un particolare testo.

non riuscivo a trovare un modo diretto per fare questo in mysql. Ma, c'è una soluzione per raggiungerlo?

È stato utile?

Soluzione

Suppongo che ci sia un solo modo per raggiungerlo. È possibile aggiungere un'altra colonna alla tabella, creare l'indice su di esso e creare trigger o fare inserimento / aggiornamento dentro le stored procedure per colmare questa colonna utilizzando seguente condizione:

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

La speranza aiuta

Altri suggerimenti

indici filtrati potrebbero essere emulate con gli indici di funzione e l'espressione CASE (MySQL 8.0.13 e successivi):

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 <> violino demo

Output:

+-----+----------+
| id  | myColumn |
+-----+----------+
|  1  | myText   |
|  2  | myText   |
|  3  | aaaaa    |
+-----+----------+
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top