原地址:http://blog.itpub.net/16396821/viewspace-679681/

今天有个项目要做升级,此项目用的是公司新产品,处于研发阶段,数据库设计文档不全,因为需要手动对比一下升级前后2个版本的ddl,发现新版本的ddl中有些分区表建的是主键。如:create table ALARM_RESULT

(
  ALARM_RESULT_ID   VARCHAR2(50) not null,
  TIME NUMBER(20)
)tablespace test_DEFAULT
partition by range (TIME)
(
  partition W values less than (5)
    tablespace test_DEFAULT,
  partition P_OTHER values less than (MAXVALUE)
    tablespace test_DEFAULT
);

此问题已反馈研发,建议取消主键,建唯一性本地索引。

分区表尽量不要建主键,因为建主键的同时会建一个唯一性的全局索引,在drop分区表时如果不指定update global indexes则
会使索引失效,导致数据无法入库。
如果非要建主键,要2种方法:
1.应用上drop 分区表时显示指定update global indexes,
2.将主键上的索引建成本地索引
上述2种方法虽然可以实现,但效果都不好。因为当数据量超大时维护索引也是很大的开销。将主键建成本地索引的方法也比较受限。

将主键建成本地索引方法:
建一个包含(分区列、主键列)的唯一性复合索引,然后在这个索引上建主键
create  unique index  idx_ALARM_RESULT_ID on ALARM_RESULT (ALARM_RESULT_ID,TIME) local; #一定要包含分区列否则会报ORA-14039: 分区列必须构成 UNIQUE 索引的关键字列子集
alter table ALARM_RESULT add primary key (ALARM_RESULT_ID,TIME);
测试分区表建主键导致数据无法入库过程:
create table ALARM_RESULT
(
  ALARM_RESULT_ID   VARCHAR2(50) not null,
  TIME NUMBER(20)
)tablespace test_DEFAULT
partition by range (TIME)
(
  partition W values less than (5)
    tablespace test_DEFAULT,
  partition P_OTHER values less than (MAXVALUE)
    tablespace test
);
alter table ALARM_RESULT  add primary key (ALARM_RESULT_ID)   using index   tablespace test_INDEX;

1.查看索引状态

SQL> select table_name,index_name,status from user_indexes;

TABLE_NAME                     INDEX_NAME                     STATUS
------------------------------ ------------------------------ --------
ALARM_RESULT                   SYS_C003358                    VALID

SQL>

2.查看各个分区的数据
SQL> select ALARM_RESULT_ID,time from ALARM_RESULT  PARTITION(w);

ALARM_RESULT_ID                                                     TIME
-------------------------------------------------- ---------------------
1                                                                      1

SQL>
SQL> select ALARM_RESULT_ID,time from ALARM_RESULT  PARTITION(p_other);

ALARM_RESULT_ID                                                     TIME
-------------------------------------------------- ---------------------
2                                                                     10

SQL>

3.drop分区
SQL> ALTER TABLE ALARM_RESULT  DROP PARTITION  w;

Table altered

SQL>

4.查看索引状态
SQL> select table_name,index_name,status from user_indexes;

TABLE_NAME                     INDEX_NAME                     STATUS
------------------------------ ------------------------------ --------
ALARM_RESULT                   SYS_C003358                    UNUSABLE

SQL>

5.向表中插入数据时报错
SQL> insert into ALARM_RESULT(ALARM_RESULT_ID,time)values(3,15);

insert into ALARM_RESULT(ALARM_RESULT_ID,time)values(3,15)

ORA-01502: 索引'owner.SYS_C003358'或这类索引的分区处于不可用状态

SQL>

6.此时如果重建一下索引,索引状态会恢复为可用状态,数据也可插入。
SQL> alter index SYS_C003358 rebuild;

Index altered

SQL> select table_name,index_name,status from user_indexes;

TABLE_NAME                     INDEX_NAME                     STATUS
------------------------------ ------------------------------ --------
ALARM_RESULT                   SYS_C003358                    VALID

SQL> insert into ALARM_RESULT(ALARM_RESULT_ID,time)values(3,15);

1 row inserted

SQL> commit;

Commit complete

SQL>

分区表尽量不要建主键相关推荐

  1. oracle建表的时候同时创建主键,外键,注释,约束,索引

    --主键 create table emp (id number constraint id_pr primary key ,name1 varchar(8)); create table emp9 ...

  2. SQL2K数据库开发八之表操作创建主键

    1.使用Transact-SQL语句在表中创建主键时,可以在创建表的语句中定义列时使用如下语法: 2.在查询分析器中输入如下的语句,可以创建一个表Suppliers,该表中的SupplierID列被定 ...

  3. 关于创建主键和索引的关系一个小小測试

    创建主键时,所相应的列假设没有索引.数据库默认会自己主动创建一个索引:假设对于列有索引,那么创建主键不会再创建索引.这里要注意,列值必须满足主键的要求(唯一,非空).简单測试例如以下: SQL> ...

  4. Oracle中用一个序列给两个表创建主键自增功能的后果

    前几天在创建数据表时,想偷个懒,使用一个序列给两个表创建主键自增功能,结果...... 情景: 为宠物中心创建一个简单的数据库,要求如下: 1.创建一个主人表,字段:主人编号,主人姓名,主人性别,主人 ...

  5. postgresql-创建主键自增的表

    之前一直用的mysql,这个也基本上是主流,主键自增是很多建表规范中的硬性要求,不过这两种数据库主键自增的区别还是很大的 通常navicat中对mysql 主键自增直接客户端指定即可,不过对PG貌似不 ...

  6. oracle视图建主键

    一个项目要求视图建主键,以下是一个样例 CREATE or replace VIEW SME_V_A....  (AGENTID,AGENTNAME,BUSYNUM,RESTNUM,RESTTIME, ...

  7. 创建主键报错:Incorrect column specifier for column ‘id‘

    创建主键报错:Incorrect column specifier for column 'id' mysql使用语句创建表将一个字段属性设置主键时,该字段的类型只能是int类型的,varchar类型 ...

  8. 数据库基本操作(创建主键、外键以及索引)

    ​ 图书馆学习没有多大干劲了,数据库又快考试了根据考试内容写总结.老师回放已过期不得不自己来尝试 心酸! 需要按照要求给表创建主键.创建索引,创建外键(并设置删除和更新规则) 一.创建主键 ​ 自己创 ...

  9. ORALCE 创建主键唯一约束同时也创建索引

    ORALCE 创建主键&唯一约束同时也创建索引 原理: 主键和唯一约束都是限制表字段值不能重复,必须唯一的约束: 当一个表中建有主键或唯一约束时,oracle会自动创建对应主键或唯一约束的索引 ...

最新文章

  1. scala学习笔记-过程、lazy值和异常(6)
  2. 《AOSuite 开发手册》之AOSuite 服务端开发
  3. vs2019安装C#环境并新建窗体项目
  4. java游戏_java开发的七个金典游戏你小时候肯定玩过
  5. 开发常用工具(提高开发效率)
  6. 身体对腐朽灵魂的一次震撼:向京的雕塑与观众的行为
  7. 【贪心】逃跑(jzoj 1748)
  8. python和html可以同时学吗_web前端入门:css+html5+javascript同时学可以吗?
  9. matlab 指定函数拟合,matlab中曲线拟合问题---使用指定函数进行曲线拟合
  10. 太阳能光伏发电行业将重入佳境
  11. java常用类objet,Java基础-常用API-Object类
  12. win7下开启梦幻桌面
  13. 域网批量装系统通用版服务器,局域网批量网刻Ghost
  14. 判断USB打印机离线状态
  15. php计算器源码,php 简单计算器
  16. SpringCloud实战微服务之——Ribbon详解
  17. 使用GridView的auto_fit遇到的坑
  18. ios系统苹果手机进行电脑微信双开方法详细教程
  19. C++牛顿迭代法解非线性方程
  20. 回顾 Firefox 历史

热门文章

  1. 朋友圈仅三天可见?怎么破?
  2. 华为手机页面刷新报404错误
  3. Luogu P1502 窗口的星星 (扫描线)
  4. qt 设置标题栏图标、任务栏图标和启动图标
  5. zzcms v8.3
  6. 陀螺仪 MPU6050 解决不同方式安装
  7. 欢迎空心字怎么写_word如何设置空心字
  8. AnyChat开发流程指南
  9. 自动设计引物的Python小程序
  10. php写接口curd,接口实战(数据库的CURD操作)