【问题标题】:Unique indexes in DB2DB2 中的唯一索引
【发布时间】:2011-07-04 20:41:53
【问题描述】:

我正在将一些 SQL 查询从 Oracle 迁移到 DB2 UDB 8。

这是 SQL 查询:

create unique index ACT_UNIQ_RU_BUS_KEY on ACT_RU_EXECUTION
(case when BUSINESS_KEY_ is null then null else PROC_DEF_ID_ end,
case when BUSINESS_KEY_ is null then null else BUSINESS_KEY_ end);

有人知道在 DB2 UDB 8.x 中什么是等效的 SQL 吗?

仅供参考:这是我为 Activiti BPM 工具创建的 SQL 查询。

【问题讨论】:

  • 我想每个 SQL 语句都是一种查询,但是许多人保留“查询”用于从数据库中检索数据的东西,使用 DML(数据修改语言)来更改数据库中数据的语句数据库,以及用于定义数据存储方式的语句的 DDL(数据定义语言)。
  • 您的索引只是利用了这样一个事实,即如果索引中的所有列都为 NULL,则索引中不会存储任何条目。 (正如 Leffler 所说,第二种 case 表达式是多余的。)您可能想知道 DB2 是否支持基于函数(或基于表达式)的索引;如果没有,您可能只需要使用 (PROC_DEF_ID_, BUSINESS_KEY_) 上的索引。

标签: oracle db2


【解决方案1】:

这似乎是一种构建索引的复杂方法,第三行看起来非常好,就好像它等同于只写BUSINESS_KEY_。假设PROC_DEF_ID_BUSINESS_KEY_ 是列名,那么索引似乎在该序列中的这两列上,如果BUSINESS_KEY_ 为空,则索引中的第一列也被视为空.

据我所知,在 DB2 中没有办法做到这一点 - 至少在 8.x 版本中没有。 CREATE INDEX 的 DB2 LUW 9.7 手册页没有提及任何等效内容。

【讨论】:

  • 谢谢,是的,PROC_DEF_ID 和 BUSINESS_KEY_ 是列。 DB2 中最接近的 SQL DDL 是什么?我可以在创建索引时在 DB2 中指定条件吗? (我认为上面的 Oracle SQL 就是这样做的。)
  • @Ayusman:AFAICS,DB2 中没有简单的解决方案。如果是 IBM Informix Dynamic Server,那么我建议使用“功能索引”,它是基于指定函数调用结果的索引,您可以在其中编写函数以返回来自 2 个 CASE 表达式的值甲骨文的例子。对DB2 9.7 Info Center 的快速检查表明没有等效的功能索引;与知识渊博的同事快速检查表明这是正确的。
  • Johnathan 是正确的,非大型机平台的 DB2 不允许表达式上的索引。解决方法是添加一个 GENERATED ALWAYS 列来存储表达式的结果,并在其上创建一个索引。即使这样,如果列/表达式可能包含 NULL,您也无法将索引定义为唯一,因为 DB2 不支持“非 NULL 时唯一”索引。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 2018-08-13
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多