MySQL hiện không hỗ trợ các chỉ mục có điều kiện.
Để đạt được những gì bạn đang yêu cầu (không phải là bạn nên làm điều đó;)) bạn có thể bắt đầu tạo một bảng phụ:
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`)
);
Sau đó, bạn thêm ba kích hoạt trong bảng chính:
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 ;
Chúng tôi cần delimiter //
bởi vì chúng tôi muốn sử dụng ;
bên trong các kích hoạt.
Theo cách đó, bảng phụ sẽ chứa chính xác các ID tương ứng với các hàng của bảng chính chứa chuỗi "HOẠT ĐỘNG", được cập nhật bởi các trình kích hoạt.
Để sử dụng trên a select
, bạn có thể sử dụng thông thường join
:
SELECT main_table.* FROM auxiliary_table LEFT JOIN main_table
ON auxiliary_table.id = main_table.id
ORDER BY auxiliary_table.name;
Nếu bảng chính đã chứa dữ liệu hoặc trong trường hợp bạn thực hiện một số thao tác bên ngoài thay đổi dữ liệu theo cách khác thường (EG: bên ngoài MySQL), bạn có thể sửa bảng phụ bằng cách này:
INSERT INTO auxiliary_table SET
id = main_table.id,
name = main_table.name,
WHERE main_table.status="ACTIVE";
Về hiệu suất, có thể bạn sẽ có các phần chèn, cập nhật và xóa chậm hơn. Điều này có thể có ý nghĩa chỉ khi bạn thực sự giải quyết một vài trường hợp trong đó điều kiện mong muốn là tích cực. Ngay cả theo cách đó, có lẽ chỉ kiểm tra bạn có thể xem liệu không gian được lưu có thực sự biện minh cho lỗi này hay không (và nếu bạn thực sự tiết kiệm bất kỳ không gian nào).