ขณะนี้ MySQL ไม่รองรับดัชนีตามเงื่อนไข
เพื่อให้ได้สิ่งที่คุณถาม (ไม่ใช่ว่าคุณควรทำ;) คุณสามารถเริ่มสร้างตารางเสริม:
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`)
);
จากนั้นคุณเพิ่มทริกเกอร์สามตัวในตารางหลัก:
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 ;
เราต้องการdelimiter //
เพราะเราต้องการใช้;
ภายในทริกเกอร์
ด้วยวิธีดังกล่าวตารางเสริมจะมีรหัสที่ตรงกับแถวของตารางหลักที่มีสตริง "ACTIVE" ซึ่งได้รับการปรับปรุงโดยทริกเกอร์
หากต้องการใช้สิ่งนั้นบน a select
คุณสามารถใช้สิ่งต่อไปนี้ตามปกติjoin
:
SELECT main_table.* FROM auxiliary_table LEFT JOIN main_table
ON auxiliary_table.id = main_table.id
ORDER BY auxiliary_table.name;
หากตารางหลักมีข้อมูลอยู่แล้วหรือในกรณีที่คุณทำการดำเนินการภายนอกที่เปลี่ยนแปลงข้อมูลในลักษณะที่ผิดปกติ (EG: นอก MySQL) คุณสามารถแก้ไขตารางเสริมด้วยสิ่งนี้:
INSERT INTO auxiliary_table SET
id = main_table.id,
name = main_table.name,
WHERE main_table.status="ACTIVE";
เกี่ยวกับประสิทธิภาพอาจเป็นไปได้ว่าจะมีการแทรกการอัพเดทและการลบที่ช้า สิ่งนี้สามารถสร้างความรู้สึกได้ก็ต่อเมื่อคุณจัดการกับบางกรณีที่เงื่อนไขที่ต้องการเป็นบวก แม้ว่าจะเป็นเช่นนั้นการทดสอบเพียงอย่างเดียวที่คุณสามารถดูได้ว่าพื้นที่ที่บันทึกไว้นั้นพิสูจน์ความจริงของเรื่องนี้ได้หรือไม่ (และถ้าคุณประหยัดพื้นที่จริงๆ)