我正在尝试在MySQL中创建索引,而查询将首先检查哪个列不为null。检查后,它将在非空的列上创建索引。但是,我没有成功创建它,它说我有错误,有人可以帮助我吗?请看下面的代码
create index IDX_KSE_NO_01 on tb_kse(ifnull(ss_no, id_no);
答案 0 :(得分:2)
@ lad2025是正确的,MySQL不支持基于函数的索引(like PostgreSQL does),但是MySQL 5.7基于表达式为virtual generated columns引入了一个功能,然后你可以在虚拟上创建索引列。
ALTER TABLE tb_kse ADD COLUMN either_no VARCHAR(10) AS (IFNULL(ss_no, id_no));
CREATE INDEX IDX_KSE_NO_01 ON tb_kse(either_no);
答案 1 :(得分:1)
MySQL不支持基于函数的索引。您应该创建正常索引:
create index IDX_KSE_NO_01 on tb_kse(ss_no);
create index IDX_KSE_NO_02 on tb_kse(id_no);
并重写您的查询(OR-Expansion):
SELECT *
FROM tb_kse WHERE ss_no = ?
UNION
SELECT *
FROM tb_kse
WHERE ss_no IS NULL AND id_no = ?;
<强> DBFiddle Demo 强>
另一种方法是创建生成的列并在其上创建索引:
CREATE TABLE tb_kse(id_no INT, ss_no INT,
gen_col INT GENERATED ALWAYS AS (ifnull(ss_no, id_no)) STORED);
create index IDX_KSE_NO_01 on tb_kse(gen_col);
SELECT *
FROM tb_kse
WHERE gen_col = ?;
<强> DBFiddle Demo 2 强>