【问题标题】:Oracle Database: Index-Organized Table with NULL Values (in Multiple-Column Primary Key)Oracle 数据库:具有 NULL 值的索引组织表(在多列主键中)
【发布时间】:2011-01-06 15:06:47
【问题描述】:

当该列是多列主键的一部分时,如何将列设置为“”(空字符串,相当于 Oracle 中的 NULL)?这就是动机……

CREATE TABLE entities (
  column1  VARCHAR2(10)
, column2  VARCHAR2(10)
, body     VARCHAR2(4000)
, CONSTRAINT pk_entities            -- can't do this, because sometimes
  PRIMARY KEY ( column1, column2 )  -- col2 is the empty string (NULL).
) ORGANIZATION INDEX ...

通常,我会使用“真正的”主键,例如无意义的顺序 ID(请参阅 this question),然后对我的数据列设置唯一约束,就像这样...

CREATE TABLE entities (
, id       NUMBER PRIMARY KEY
, column1  VARCHAR2(10)
, column2  VARCHAR2(10)
, body     VARCHAR2(4000)
, CONSTRAINT unq_entities 
  UNIQUE ( column1, column2 )
) ORGANIZATION INDEX ...

但是,这是一个大型索引组织表 (IOT),因此主键必须位于数据列上(在 IOT 中,数据是索引),否则......我该怎么办?

谢谢! ♥

【问题讨论】:

    标签: database oracle null indexing primary-key


    【解决方案1】:

    不幸的是,这是 Oracle 特有的“功能”。与其他 SQL DBMS 不同,它不支持零长度字符串值,并且坚持将其转换为 null。

    您可以创建另一列作为标志来表示零长度字符串,然后存储空格来代替列本身。我不认为有一个完美的解决方法。 Oracle 没有解决这个奇怪的限制有点令人惊讶 - 特别是考虑到他们在其他方面做出了巨大的改进以符合 SQL 标准。

    【讨论】:

      【解决方案2】:

      将空字符串替换为虚拟字符串并稍后检查...这取决于表的使用方式。

      【讨论】:

      • 不能这样做; column2 中的值可以是anything
      【解决方案3】:

      为什么您需要表成为物联网?使用堆表在 column1、column2 上的 UNIQUE INDEX 可能几乎与数据检索一样有效。

      IOT(类似于具有聚集索引的表)是例外,而不是 Oracle 中的常态。

      【讨论】:

        猜你喜欢
        • 2011-11-12
        • 2019-09-13
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多