sql >> Database teknologi >  >> RDS >> Mysql

Løsning i mysql for delvist indeks eller filtreret indeks?

Filtrerede indekser kunne emuleres med funktionsindekser og CASE udtryk (MySQL 8.0.13 og nyere):

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

Output:

+-----+----------+ | id | myColumn | +-----+----------+ | 1 | myText | | 2 | myText | | 3 | aaaaa | +-----+----------+

  1. Oracle Indsæt Vælg med bestil efter

  2. Beregn alder med decimaler fra fødselsdato

  3. Webrick er meget langsom til at reagere. Hvordan fremskyndes det?

  4. SQL Manglende højre parentes på rækkefølge efter sætning