MySQL al momento non supporta gli indici condizionali.
Per raggiungere quello che stai chiedendo (non che tu debba farlo;)) puoi iniziare a creare una tabella ausiliaria:
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`)
);
Quindi aggiungi tre trigger nella tabella principale:
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 ;
Abbiamo bisogno delimiter //
perché vogliamo usare ;
all'interno dei grilletti.
In questo modo, la tabella ausiliaria conterrà esattamente gli ID corrispondenti alle righe della tabella principale che contengono la stringa "ATTIVO", in fase di aggiornamento dai trigger.
Per usarlo su a select
, puoi usare il solito join
:
SELECT main_table.* FROM auxiliary_table LEFT JOIN main_table
ON auxiliary_table.id = main_table.id
ORDER BY auxiliary_table.name;
Se la tabella principale contiene già dei dati, o nel caso in cui si esegua un'operazione esterna che modifica i dati in modo insolito (ad esempio: fuori da MySQL), è possibile correggere la tabella ausiliaria con questo:
INSERT INTO auxiliary_table SET
id = main_table.id,
name = main_table.name,
WHERE main_table.status="ACTIVE";
Per quanto riguarda le prestazioni, probabilmente avrai inserimenti, aggiornamenti ed eliminazioni più lenti. Questo può avere senso solo se si affrontano davvero pochi casi in cui la condizione desiderata è positiva. Anche così, probabilmente solo testando puoi vedere se lo spazio risparmiato giustifica davvero questo approccio (e se stai davvero risparmiando spazio).