【发布时间】:2021-07-06 03:07:27
【问题描述】:
可以在创建主键时指定索引:
CREATE TABLE t (a NUMBER, b NUMBER);
ALTER TABLE t ADD PRIMARY KEY (a,b) USING INDEX (CREATE INDEX i ON t(a,b));
这也适用于列子集:
ALTER TABLE t ADD PRIMARY KEY (a) USING INDEX (CREATE INDEX i ON t(a,b));
我更喜欢唯一索引(因为非唯一索引会将 rowid 添加到每个键中,这会使索引更大且速度稍慢)。这也有效:
ALTER TABLE t ADD PRIMARY KEY (a,b) USING INDEX (CREATE UNIQUE INDEX i ON t(a,b));
但是,子集和唯一索引会导致错误:
ALTER TABLE t ADD PRIMARY KEY (a) USING INDEX (CREATE UNIQUE INDEX u ON t(a,b));
ORA-14196: Specified index cannot be used to enforce the constraint.
总结一下:
OK PRIMARY KEY (a,b) USING INDEX ( INDEX(a,b) )
OK PRIMARY KEY (a,b) USING INDEX ( UNIQUE INDEX(a,b) )
OK PRIMARY KEY (a) USING INDEX ( INDEX(a,b) )
ERROR PRIMARY KEY (a) USING INDEX ( UNIQUE INDEX(a,b) )
我完全不明白为什么这是不可能的。
我经常需要它,例如对于具有两个主键列(比如国家、城市)和另一列(比如人口)的表。因为我总是查询另一列,所以三列索引是有意义的。由于前两列是唯一的(每个主键),索引也将是唯一的,但 Oracle 不会让我这样做。为什么?
【问题讨论】: