【问题标题】:Creating index by concatinating multiple columns MySQL通过连接多个列 MySQL 创建索引
【发布时间】:2016-01-28 08:05:43
【问题描述】:

我是 mySQL 的新手,正在尝试从 oracle 迁移到 MySQL,并且我有一个需要转换为 mySQL 的索引。在 oracle 中,我使用 2 列创建了这个索引:

CREATE INDEX TEST ON TABLE(COL1||'/'||COL2, COL3)

现在我正在尝试在 mySQL 中找到替代方法。我知道我可以在我的 sql 中的多个列上创建索引,例如:

CREATE INDEX TEST on TABLE(COL1, COL2)

但我想在多个列上创建索引,以便我可以使用“/”分隔符组合 COL1 和 COL2 并在其上创建索引。我发现我可以创建一个生成的列并在其上创建索引。所以基本上我会有这样的东西:

 CREATE INDEX TEST on TABLE(GENERATED_COL, COL2)

当我尝试创建此生成列时,我不断收到生成列的语法错误。这是我创建表的语法:

CREATE TABLE PATH (
ID INT(38) NOT NULL,
PATH_PREFIX VARCHAR(2000) NOT NULL,
PATH_SUFFIX VARCHAR(255) NOT NULL,
FULLPATH VARCHAR(3000) AS (CONCAT(PATH_PREFIX,'/',PATH_SUFFIX)),
PRIMARY KEY (ID)
)

这是我的错误:

SQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS (CONCAT(PATH_PREFIX,'/',PATH_SUFFIX)),
PRIMARY KEY (ID)

不确定我是否在这里做错了什么?如果这不是正确的方法,有人可以告诉我创建索引的正确方法,如 CONCAT(PATH_PREFIX,'/',PATH_SUFFIX)

【问题讨论】:

  • MySql 不允许基于函数的索引。你不能那样做。您可以在表中创建一个附加列(比如COL_X),用CONCAT(PATH_PREFIX,'/',PATH_SUFFIX) 填充它,然后在这个新列上创建索引。 COL_X)。另一种选择是继续使用 Oracle,或者迁移到允许基于函数的索引的数据库 - 例如 PostgreSQL 或 MS-Sql。
  • @kordirko 那么您是说创建新列并且每次对该表进行条目时都会有一些触发器使用连接值填充该新列?
  • @kordirko 从 v5.7.6 开始,您可以创建生成的列。如果你把它的类型设置为stored,那么xou可以在它上面创建二级索引。
  • @Shadow 你能告诉我如何创建这个索引吗?我不确定我是否关注您的评论。

标签: mysql database oracle


【解决方案1】:

从 mysql v5.7.6 开始,您可以创建生成的列。如果将其类型设置为存储,则可以在其上创建二级索引。从 v5.7.8 开始,您甚至可以在虚拟生成的列上创建索引,请参阅create table 上的 mysql 文档:

从 MySQL 5.7.8 开始,InnoDB 支持虚拟二级索引 生成的列。不支持其他索引类型。

二级索引可以在一个或多个虚拟列上创建,也可以在 虚拟列和非虚拟生成列的组合。 虚拟列上的二级索引可以定义为 UNIQUE。

【讨论】:

  • 按照文档中提到的语法,我更新了创建表语法以使用“FULLPATH VARCHAR(3000) GENERATED ALWAYS AS (CONCAT(PATH_PREFIX,'/',PATH_SUFFIX))”,但我仍然得到同样的错误.如果允许,那么我不确定是什么导致了这个错误。您发现我的创建表语法有什么问题吗?
  • 首先检查基础知识:你的mysql服务器的版本。
猜你喜欢
  • 2021-06-20
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2019-02-19
相关资源
最近更新 更多