2012-05-15 13 views

Odpowiedz

46

Nie, nie w ogólnym sensie, nie wierzę, że nawet 5.6 ma tę funkcję. To jest możliwe, aby używać tylko części kolumny (ta funkcja była dostępna od dłuższego czasu), ale nie zaczyna się od drugiego lub kolejnych znaków, ani żadnej innej bardziej złożonej funkcji.

Na przykład, co następuje tworzy indeks używając pięć pierwszych znaków nazwy:

create index name_first_five on cust_table (name(5)); 

Dla bardziej złożonych wyrażeń, można osiągnąć podobny efekt poprzez kolejna kolumna z wymiennymi danych w to, a następnie użyj wyzwalaczy wstawiania/aktualizacji, aby upewnić się, że jest poprawnie wypełniony.

Inne niż zmarnowane miejsce na nadmiarowe dane, to prawie to samo.

I choć technicznie narusza 3NF, jest to łagodzone przez użycie wyzwalaczy w celu synchronizacji danych (jest to często wykonywane w celu zwiększenia wydajności).

+0

Dziękuję ... w moim przypadku wystarczy użyć pierwszych 8 znaków łańcucha jako indeksu. czy mogę użyć: stworzyć index name_first_8 na cust_table (name (8)); – user836026

+2

@ user836026: tak, to powinno działać. – paxdiablo

+0

@paxdiablo, zaktualizuj 5.6 '5.7'. byłoby wspaniale, gdyby dodać do niego cytat 8.0. – Adrian

17

MySQL nie obsługuje tego, ale istnieje alternatywa.

1. Ponieważ MySQL 5.7.6

można użyć automatycznie generowane kolumnę trzymać podciąg z indeksem na nim:

CREATE TABLE SomeTable (
    id CHAR(10), 
    sub_id CHAR(8) AS SUBSTRING(id, 1, 8) STORED, INDEX(sub_id) 
) 

Jak Benjamin zauważyć, InnoDB obsługuje indeksy wtórnych w wirtualnych kolumnach, więc słowo kluczowe ZACHOWANE może zostać pominięte. W rzeczywistości preferowane mogą być indeksy pomocnicze na wirtualnych kolumnach. Więcej informacji tutaj: Secondary Indexes and Generated Columns

2. Przed MySQL 5.7.6

można użyć kolumny zaktualizowane przez wyzwalacz z indeksem na nim:

CREATE TABLE SomeTable (
    id CHAR(10), 
    sub_id CHAR(8) , INDEX(sub_id) 
); 

CREATE TRIGGER TR_SomeTable_INSERT_sub_id 
    BEFORE INSERT 
    ON SomeTable FOR EACH ROW 
    SET NEW.sub_id = SUBSTRING(NEW.id, 1, 8); 

CREATE TRIGGER TR_SomeTable_UPDATE_sub_id 
    BEFORE UPDATE 
    ON SomeTable FOR EACH ROW 
    SET NEW.sub_id = SUBSTRING(NEW.id, 1, 8); 
+1

Należy zauważyć, że zgodnie z [dokumentacją] (https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html), * InnoDB obsługuje indeksy pomocnicze na wirtualnych kolumnach *. Możesz więc pominąć słowo kluczowe 'STORED', aby kolumna była wirtualna, zaoszczędzić trochę miejsca i nadal mieć indeksowane dane! – Benjamin

Powiązane problemy