在mysql中使用ifnull创建索引

gupuwyp2  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(1003)

我试图在mysql中创建一个索引,而查询将首先检查哪个列不为null。检查之后,它将在不为null的列上创建索引。然而,我没有成功地创造这个,它说我有一个错误,有人能帮我吗?请看下面我的代码

create index IDX_KSE_NO_01 on tb_kse(ifnull(ss_no, id_no);
vu8f3i0k

vu8f3i0k1#

mysql不支持基于函数的索引。您应该创建普通索引:

create index IDX_KSE_NO_01 on tb_kse(ss_no);
create index IDX_KSE_NO_02 on tb_kse(id_no);

并重写查询(或扩展):

SELECT *
FROM tb_kse WHERE ss_no = ?
UNION 
SELECT *
FROM tb_kse
WHERE ss_no IS NULL AND id_no = ?;

dbfiddle演示
另一种方法是创建生成的列并在其上创建索引:

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演示2

1rhkuytd

1rhkuytd2#

@lad2025是正确的,mysql不支持基于函数的索引(像postgresql那样),但是mysql 5.7引入了一个基于表达式的虚拟生成列的特性,然后您可以在虚拟列上创建索引。

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

相关问题