在 mysql 中使用 ifnull 和索引创建
using ifnull with index creation in mysql
我正在尝试在 MySQL 中创建索引,而查询将首先检查哪一列不为空。检查后,它将在非空列上创建索引。但是,我没有成功创建它,它说我有错误,有人可以帮助我吗?请在下面查看我的代码
create index IDX_KSE_NO_01 on tb_kse(ifnull(ss_no, id_no);
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 = ?;
另一种方法是创建生成列并在其上创建索引:
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 = ?;
@lad2025 是正确的 MySQL 不支持基于函数的索引(like PostgreSQL does), but MySQL 5.7 introduced a feature for 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);
我正在尝试在 MySQL 中创建索引,而查询将首先检查哪一列不为空。检查后,它将在非空列上创建索引。但是,我没有成功创建它,它说我有错误,有人可以帮助我吗?请在下面查看我的代码
create index IDX_KSE_NO_01 on tb_kse(ifnull(ss_no, id_no);
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 = ?;
另一种方法是创建生成列并在其上创建索引:
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 = ?;
@lad2025 是正确的 MySQL 不支持基于函数的索引(like PostgreSQL does), but MySQL 5.7 introduced a feature for 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);