java - MariaDB 功能索引

标签 java mysql sql mariadb

我正在尝试定义下表:

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 中的结果:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '( CASE WHEN type = 1 THEN type END ) ), UNIQUE INDEX tppad ( gid, ( CASE' at line 1

我该如何解决这个错误?

换句话说:MariaDB 的等价物是什么?

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

最佳答案

使用生成的列:

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不允许表达式作为索引键。但是您可以使用生成的列轻松解决这个问题。

关于java - MariaDB 功能索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59818683/

相关文章:

JavaCV Canvas 保持空白

java - 如何保持线程执行直到异步线程返回回调

mysql - 尝试在 SnapLogic 中创建 derby 帐户时出现错误

java - Android 结合两个 LayoutParams

php - 如何更改服务器时区而不影响已插入的数据?

java - 如何使用Java将HTML文本存储在sql数据库中

php - SQL 按价格/平方米排序

sql - Oracle RATIO_TO_REPORT 和汇总

SQL - 多子句

java - 如何在 Mesh RestClient 中发送 Json 对象请求并接收节点响应?