MySQL şu anda koşullu dizinleri desteklememektedir.
Ne istediğinizi anlamak için (yapmamalısın;);) bir yardımcı tablo oluşturmaya başlayabilirsiniz:
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`)
);
Sonra ana tabloya üç tetikleyici eklersiniz:
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 ;
İhtiyacımız var delimiter //
çünkü ;
tetikleyicilerin içinde kullanmak istiyoruz .
Bu şekilde, yardımcı tablo tam olarak tetikleyiciler tarafından güncellenen "ACTIVE" dizisini içeren ana tablo satırlarına karşılık gelen ID'leri içerecektir.
Bunu kullanmak select
için normali kullanabilirsiniz join
:
SELECT main_table.* FROM auxiliary_table LEFT JOIN main_table
ON auxiliary_table.id = main_table.id
ORDER BY auxiliary_table.name;
Ana tablo zaten veri içeriyorsa veya alışılmadık şekilde değiştiren bazı harici işlemler yapmanız durumunda (EG: MySQL dışında), yardımcı tabloyu şununla düzeltebilirsiniz:
INSERT INTO auxiliary_table SET
id = main_table.id,
name = main_table.name,
WHERE main_table.status="ACTIVE";
Performans hakkında muhtemelen daha yavaş ekler, güncellemeler ve silme işlemleriniz olur. Bu, ancak istenen koşulun olumlu olduğu birkaç durumla gerçekten ilgileniyorsanız, bir anlam ifade edebilir. Bu şekilde bile, muhtemelen yalnızca sınanan, alanın bu yaklaşımı haklı gösterip göstermediğini (ve gerçekten de herhangi bir yerden tasarruf ediyorsanız) görebilirsiniz.