前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >创建主键的三种方式对指定索引表空间操作的纠正

创建主键的三种方式对指定索引表空间操作的纠正

作者头像
bisal
发布2021-09-06 15:44:24
4040
发布2021-09-06 15:44:24
举报
文章被收录于专栏:bisal的个人杂货铺

Oracle创建主键的三种方式》曾说了创建主键的三种方式,对第三种方式的作用,提到了这个原因,

往往在生产环境,数据表空间和索引表空间是分开的,如果采用第一种和第二种的方式,主键索引会创建在执行用户的默认表空间,很可能是数据表空间,因此分开创建,还可以在创建索引的时候,指定tablespace,明确索引表空间, bisal,公众号:bisal的个人杂货铺Oracle创建主键的三种方式

经过TigerLiu老师的提醒,描述有误,其实是用第一种和第二种方式,都可以指定独立的索引表空间,如下所示。

第一种,直接在定义中,增加using index tablespace xxx,

代码语言:javascript
复制
SQL> create table t01 (id number, constraint pk_id_01 primary key(id) using index tablespace index_tbs);
Table created.

索引会创建在指定的表空间中,

代码语言:javascript
复制
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,

代码语言:javascript
复制
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.
代码语言:javascript
复制
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》,

但是有些限制,

并给出了示例,

代码语言:javascript
复制
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的同时,创建索引,如下所示,

代码语言:javascript
复制
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是个未实现的特性,

代码语言:javascript
复制
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指定并行,

代码语言:javascript
复制
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.

可以看到,确实指定了并行,

代码语言:javascript
复制
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

一个创建主键的操作就会有这么多种语法格式,从这个案例看,只能说自己要学习的还很多,“由点及面”的过程,确实很艰难,继续积累了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档