《Oracle创建主键的三种方式》曾说了创建主键的三种方式,对第三种方式的作用,提到了这个原因,
往往在生产环境,数据表空间和索引表空间是分开的,如果采用第一种和第二种的方式,主键索引会创建在执行用户的默认表空间,很可能是数据表空间,因此分开创建,还可以在创建索引的时候,指定tablespace,明确索引表空间, bisal,公众号:bisal的个人杂货铺Oracle创建主键的三种方式
经过TigerLiu老师的提醒,描述有误,其实是用第一种和第二种方式,都可以指定独立的索引表空间,如下所示。
第一种,直接在定义中,增加using index tablespace xxx,
SQL> create table t01 (id number, constraint pk_id_01 primary key(id) using index tablespace index_tbs);
Table created.
索引会创建在指定的表空间中,
SQL> select table_name, index_name, tablespace_name, uniqueness from user_indexes where table_name='T01';
TABLE_NAME INDEX_NAME TABLESPACE_NAME UNIQUENES
------------------------- ------------------------- ------------------------------ ---------
T01 PK_ID_01 INDEX_TBS UNIQUE
第二种,alter table主键的时候,同样增加using index tablespace,
SQL> create table t01 (id number);
Table created.
SQL> alter table t01 add constraint pk_id_t01 primary key (id) using index tablespace index_tbs;
Table altered.
SQL> select table_name, index_name, tablespace_name, uniqueness from user_indexes where table_name='T01';
TABLE_NAME INDEX_NAME TABLESPACE_NAME UNIQUENES
------------------------- ------------------------- ------------------------------ ---------
T02 PK_ID_T01 INDEX_TBS UNIQUE
其实Oracle的官方手册,就提到了创建主键约束/唯一约束时,可以指定表空间,如下是11g的《SQL Language Reference》,
但是有些限制,
并给出了示例,
CREATE TABLE promotions_var3
( promo_id NUMBER(6)
, promo_name VARCHAR2(20)
, promo_category VARCHAR2(15)
, promo_cost NUMBER(10,2)
, promo_begin_date DATE
, promo_end_date DATE
, CONSTRAINT promo_id_u UNIQUE (promo_id, promo_cost)
USING INDEX (CREATE UNIQUE INDEX promo_ix1
ON promotions_var3 (promo_id, promo_cost))
, CONSTRAINT promo_id_u2 UNIQUE (promo_cost, promo_id)
USING INDEX promo_ix1);
的确能在create table的同时,创建索引,如下所示,
SQL> create table t01 (id number, constraint pk_t01_id primary key(id) using index
2 (create unique index idx_pk_t01_id on t01(id) online tablespace index_tbs));
Table created.
有一点值得注意,文中提到了,使用using index的时候,不能指定并行,
You cannot specify the parallel_clause of index_attributes.
一开始我理解错了,其实他指的是,using index子句不能指定parallel,
会提示parallel是个未实现的特性,
SQL> create table t01 (id number, constraint pk_t01_id primary key(id) using index parallel 16 (create unique index idx_pk_t01_id on t01(id) online tablespace index_tbs);
*
ERROR at line 1:
ORA-03001: unimplemented feature
但是不能阻止create index指定并行,
SQL> create table t01 (id number, constraint pk_t01_id primary key(id) using index
2 (create unique index idx_pk_t01_id on t01(id) parallel 16 online tablespace index_tbs));
Table created.
可以看到,确实指定了并行,
SQL> select table_name, index_name, tablespace_name, uniqueness, degree
2 from user_indexes where table_name='T01';
TABLE_NAME INDEX_NAME TABLESPACE_NAME UNIQUENES DEGREE
--------------- --------------- --------------- --------- ---------------
T02 IDX_PK_T01_ID INDEX_TBS UNIQUE 16
一个创建主键的操作就会有这么多种语法格式,从这个案例看,只能说自己要学习的还很多,“由点及面”的过程,确实很艰难,继续积累了。