MySQL saat ini tidak mendukung indeks bersyarat.
Untuk mencapai apa yang Anda minta (bukan bahwa Anda harus melakukannya;)) Anda bisa mulai membuat tabel tambahan:
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`)
);
Kemudian Anda menambahkan tiga pemicu di tabel utama:
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 ;
Kami perlu delimiter //karena kami ingin menggunakan ;di dalam pemicu.
Dengan begitu, tabel tambahan akan berisi persis ID yang sesuai dengan baris tabel utama yang berisi string "AKTIF", sedang diperbarui oleh pemicu.
Untuk menggunakannya pada select, Anda dapat menggunakan yang biasa join:
SELECT main_table.* FROM auxiliary_table LEFT JOIN main_table
ON auxiliary_table.id = main_table.id
ORDER BY auxiliary_table.name;
Jika tabel utama sudah berisi data, atau jika Anda membuat beberapa operasi eksternal yang mengubah data dengan cara yang tidak biasa (EG: di luar MySQL), Anda bisa memperbaiki tabel tambahan dengan ini:
INSERT INTO auxiliary_table SET
id = main_table.id,
name = main_table.name,
WHERE main_table.status="ACTIVE";
Tentang kinerja, mungkin Anda akan memiliki sisipan, pembaruan, dan penghapusan yang lebih lambat. Ini bisa masuk akal hanya jika Anda benar-benar menangani beberapa kasus di mana kondisi yang diinginkan adalah positif. Meski begitu, mungkin hanya menguji Anda dapat melihat apakah ruang yang disimpan benar-benar membenarkan pendekatan ini (dan jika Anda benar-benar menghemat ruang sama sekali).