Database Oracle数据库:具有空值的索引组织表(在多列主键中)

Database Oracle数据库:具有空值的索引组织表(在多列主键中),database,oracle,null,indexing,primary-key,Database,Oracle,Null,Indexing,Primary Key,当一列是多列主键的一部分时,如何将该列设置为“”(空字符串,在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, co

当一列是多列主键的一部分时,如何将该列设置为“”(空字符串,在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(请参阅),然后在我的数据列上设置一个唯一的约束,就像这样

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中,数据就是索引),否则。。。我该怎么办


谢谢!♥

将空字符串替换为伪字符串,稍后再检查它。。。但这取决于表的使用方式。

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

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

为什么需要将表作为一个IOT?在第1列、第2列和堆表上创建一个唯一的索引对于数据检索来说可能同样有效


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

无法做到这一点;
列2中的值可以是任何值。