MySQL unterstützt derzeit keine bedingten Indizes.
Um zu erreichen, wonach Sie fragen (nicht, dass Sie es tun sollten;)), können Sie eine Hilfstabelle erstellen:
CREATE TABLE `my_schema`.`auxiliary_table` (
`id` int unsigned NOT NULL,
`name` varchar(250), /* specify the same way as in your main table */
PRIMARY KEY (`id`),
KEY `name` (`name`)
);
Dann fügen Sie drei Trigger in die Haupttabelle ein:
delimiter //
CREATE TRIGGER example_insert AFTER INSERT ON main_table
FOR EACH ROW
BEGIN
IF NEW.status = 'ACTIVE' THEN
REPLACE auxiliary_table SET
auxiliary_table.id = NEW.id,
auxiliary_table.name = NEW.name;
END IF;
END;//
CREATE TRIGGER example_update AFTER UPDATE ON main_table
FOR EACH ROW
BEGIN
IF NEW.status = 'ACTIVE' THEN
REPLACE auxiliary_table SET
auxiliary_table.id = NEW.id,
auxiliary_table.name = NEW.name;
ELSE
DELETE FROM auxiliary_table WHERE auxiliary_table.id = OLD.id;
END IF;
END;//
CREATE TRIGGER example_delete AFTER DELETE ON main_table
FOR EACH ROW
BEGIN
DELETE FROM auxiliary_table WHERE auxiliary_table.id = OLD.id;
END;//
delimiter ;
Wir brauchen, delimiter //
weil wir ;
in den Triggern verwenden wollen.
Auf diese Weise enthält die Hilfstabelle genau die IDs, die den Haupttabellenzeilen entsprechen, die die Zeichenfolge "ACTIVE" enthalten und von den Triggern aktualisiert werden.
Um das auf einem zu benutzen, select
können Sie das übliche benutzen join
:
SELECT main_table.* FROM auxiliary_table LEFT JOIN main_table
ON auxiliary_table.id = main_table.id
ORDER BY auxiliary_table.name;
Wenn die Haupttabelle bereits Daten enthält oder Sie eine externe Operation ausführen, die Daten auf ungewöhnliche Weise ändert (z. B. außerhalb von MySQL), können Sie die Hilfstabelle folgendermaßen reparieren:
INSERT INTO auxiliary_table SET
id = main_table.id,
name = main_table.name,
WHERE main_table.status="ACTIVE";
In Bezug auf die Leistung werden Sie wahrscheinlich langsamere Einfügungen, Aktualisierungen und Löschvorgänge haben. Dies kann nur dann sinnvoll sein, wenn Sie sich wirklich mit wenigen Fällen befassen, in denen der gewünschte Zustand positiv ist. Selbst auf diese Weise können Sie wahrscheinlich nur beim Testen feststellen, ob der gespeicherte Speicherplatz diesen Ansatz wirklich rechtfertigt (und ob Sie überhaupt wirklich Speicherplatz sparen).