2012-05-15 24 views

Antwort

46

Nein, nicht in einem allgemeinen Sinn, ich glaube nicht einmal, dass 5.6 diese Funktionalität hat. Es ist ist möglich, nur die führenden Teil einer Spalte zu verwenden (diese Funktionalität gibt es schon seit langer Zeit), aber nicht eine beginnt bei der zweiten oder nachfolgenden Zeichen oder andere komplexere Funktion.

Zum Beispiel die folgenden erstellt einen Index die ersten fünf Zeichen eines Namens mit:

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

Für komplexere Ausdrücke, können Sie, indem andere Spalte mit den Wende Daten, die eine ähnliche Wirkung erzielen in Dann verwenden Sie Trigger einfügen/aktualisieren, um sicherzustellen, dass sie richtig ausgefüllt sind.

Anders als der überflüssige Platz für redundante Daten, ist das ziemlich genau dasselbe.

Und obwohl es technisch 3NF verletzt, wird dies durch die Verwendung von Triggern gemildert, um die Daten synchron zu halten (dies wird oft für zusätzliche Leistung getan).

+0

Danke dir ... für meinen Fall brauche ich nur die ersten 8 Zeichen der Zeichenfolge als Index zu verwenden. könnte ich verwenden: create index name_first_8 auf cust_table (name (8)); – user836026

+2

@ user836026: Ja, das sollte funktionieren. – paxdiablo

+0

@paxdiablo, bitte aktualisieren Sie 5.6 '5.7'. wäre toll, wenn Sie Zitat 8.0 darin hinzufügen. – Adrian

17

MySQL unterstützt dies nicht, aber es gibt eine Alternative.

1. Seit MySQL 5.7.6

Sie ein Auto verwenden können Spalt erzeugen den Teil mit einem Index auf ihn zu halten:

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

Wie Benjamin erwähnt, unterstützt InnoDB Sekundärindizes Auf virtuellen Spalten kann das STORED-Schlüsselwort weggelassen werden. In der Tat können sekundäre Indizes für virtuelle Spalten vorzuziehen sein. Mehr Infos hier: Secondary Indexes and Generated Columns

2. Vor MySQL 5.7.6

können Sie eine Spalte durch einen Trigger aktualisiert Verwendung mit einem Index auf es:

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

Beachten Sie, dass gemäß der [Dokumentation] (https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html) * InnoDB Sekundärindizes für virtuelle Spalten * unterstützt. Sie können also das Schlüsselwort 'STORED' weglassen, um die Spalte virtuell zu machen, Speicherplatz zu sparen und trotzdem die Daten indizieren zu lassen! – Benjamin

Verwandte Themen