MySQL obecnie nie obsługuje indeksów warunkowych.
Aby osiągnąć to, o co prosisz (nie to, że powinieneś to zrobić;)) możesz zacząć tworzyć tabelę pomocniczą:
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`)
);
Następnie dodajesz trzy wyzwalacze w głównej tabeli:
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 ;
Potrzebujemy, delimiter //
ponieważ chcemy używać ;
wewnątrz wyzwalaczy.
W ten sposób tabela pomocnicza będzie zawierać dokładnie identyfikatory odpowiadające głównym wierszom tabeli zawierającym ciąg „AKTYWNY”, aktualizowanym przez wyzwalacze.
Aby użyć tego na a select
, możesz użyć zwykłego join
:
SELECT main_table.* FROM auxiliary_table LEFT JOIN main_table
ON auxiliary_table.id = main_table.id
ORDER BY auxiliary_table.name;
Jeśli główna tabela już zawiera dane lub jeśli wykonasz operację zewnętrzną, która zmienia dane w nietypowy sposób (np. Poza MySQL), możesz naprawić tabelę pomocniczą w ten sposób:
INSERT INTO auxiliary_table SET
id = main_table.id,
name = main_table.name,
WHERE main_table.status="ACTIVE";
Jeśli chodzi o wydajność, prawdopodobnie będziesz mieć wolniejsze wstawianie, aktualizowanie i usuwanie. Może to mieć sens tylko wtedy, gdy naprawdę masz do czynienia z kilkoma przypadkami, w których pożądany stan jest pozytywny. Nawet w ten sposób, prawdopodobnie tylko testy pozwalają sprawdzić, czy zaoszczędzone miejsce naprawdę uzasadnia to podejście (i czy naprawdę oszczędzasz w ogóle miejsce).