2011-01-06 89 views
4

如何将列设置为“”(空字符串,相当于Oracle中的NULL),该列是多列主键?这是动机...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中,数据是索引),否则......我该怎么办?

谢谢! ♥

回答

2

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

您可以创建另一列作为标志来表示零长度字符串,然后将空间存储在列本身的位置。尽管如此,我不认为有一个完美的解决方法。甲骨文还没有解决这个奇怪的限制是有点令人惊讶的 - 尤其是考虑到他们在其他方面取得的巨大进步以符合SQL标准。

1

用空字符串替换空字符串,稍后检查...取决于表是如何使用的。

+0

不能这样做; `column2`中的值可以是* anything *。 – Anastasia 2011-01-06 15:17:34

0

为什么你需要该表是一个物联网?列1,列2上具有堆表的UNIQUE INDEX对于数据检索可能几乎同样有效。

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