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).