【问题标题】:MariaDB functional indexMariaDB 功能索引
【发布时间】:2020-05-06 04:34:51
【问题描述】:

我正在尝试定义下表:

CREATE TABLE IF NOT EXISTS `test` (
  `gid` INT NOT NULL,
  `x` INT NOT NULL,
  `y` INT NOT NULL,
  `z` INT NOT NULL,
  `type` INT NOT NULL,
  ...
  PRIMARY KEY ( `gid`, `x`, `y`, `z` ),
  UNIQUE INDEX `type_index` ( `gid`, ( CASE WHEN `type` = 1 THEN `type` END ) ),
  UNIQUE INDEX `tp_index` ( `gid`, ( CASE WHEN `type` = 2 THEN ... END ) ),
);

type 为1 时,我希望该表允许每个gid 一个条目,而对于任何其他类型,它可以每个gid 有多个条目。在 MySQL 中,此查询运行良好。但是,使用 MariaDB 查询根本不起作用。

MariaDB 中的结果:

您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在 '( CASE WHEN type = 1 THEN type END ) )、UNIQUE INDEX tppad (gid, ( CASE' 在第 1 行附近使用的正确语法

我该如何解决这个错误?

换句话说:MariaDB 相当于什么?

我正在使用版本10.2.20-MariaDB-10.2.20+maria~xenial-log

【问题讨论】:

  • 为什么要在索引定义中使用 case 语句?你的目标是什么?
  • 因为每个gid 只允许一个类型为 1 的条目,而允许多个其他类型的条目。

标签: java mysql sql mariadb


【解决方案1】:

使用生成的列:

type_is_1 boolean generated always as (case when type = 1 then 1 end),
type_is_2 boolean generated always as (case when type = 2 then 1 end),
UNIQUE INDEX type_index ( gid, type_is_1 ),
UNIQUE INDEX tp_index ( gid, type_is_2 )

也就是说 MariaDB 不允许表达式作为索引键。但是您可以使用生成的列轻松解决这个问题。

【讨论】:

  • 不起作用,因为例如我想允许 type = 3 的多行。
  • @BjörnSchönrock 。 . .我修改了答案。生成的列在类型不正确时需要为NULL
  • 我已经在玩这个了。谢谢你的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 2020-04-05
  • 2021-01-15
  • 2011-03-16
  • 1970-01-01
  • 2010-12-01
  • 2021-01-29
相关资源
最近更新 更多