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

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

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

近期更新的文章:

Oracle优化器的“短路”

小白学习MySQL - MySQL会不会受到“高水位”的影响?

MySQL行转列的小需求

Oracle的greatest和least函数

我的股市生涯

Oracle创建主键的三种方式

非Oracle Linux下Oracle 19c CDB数据库安装

案例纠正一则

小白学习MySQL - 数据库软件和初始化安装

小白学习MySQL - 闲聊聊

Redis和Sentinel的安装部署和配置

“火线”和“零线”

通过索引提升SQL性能案例一则

如何手动添加jar包到maven本地库?

1元股权转让的一点思考

如何打造一个经常宕机的业务系统?

Linux恢复误删文件的操作

Linux的scp指令使用场景

Oracle处理IN的几种方式

如何搭建一支拖垮公司的技术团队?

IP地址解析的规则

MySQL的skip-grant-tables

国产数据库不平凡的一年

Oracle要求顺序的top数据检索问题

日常工作中碰到的几个技术问题

了解一下sqlhc

Oracle的MD5函数介绍

Oracle 19c的examples静默安装

sqlplus登录缓慢的解决

VMWare 11安装RedHat Linux 7过程中碰到的坑

COST值相同?是真是假?

Oracle 11g的examples静默安装

文章分类和索引:

公众号700篇文章分类和索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值