在介绍ADD VALUES和DROP VALUES语句的时候提到过,ADD VALUES和DROP VALUES只是数据字典上的变更,并不涉及数据的变化。因此如果ADD VALUES或DROP VALUES语句执行时,新增或删除的键值在数据库中已经存在,则会报错。

仍然借用上一篇文章中的例子:

SQL> CREATE TABLE T_PART_LIST

2  (

3     OWNER VARCHAR2(30),

4     NAME VARCHAR2(30),

5     TABLESPACE_NAME VARCHAR2(30),

6     TYPE VARCHAR2(18)

7  )

8  PARTITION BY LIST (TABLESPACE_NAME)

9  (

10  PARTITION P1 VALUES ('SYSTEM'),

11  PARTITION P2 VALUES ('YANGTK'),

12  PARTITION P3 VALUES ('USERS'),

13  PARTITION P4 VALUES (DEFAULT)

14  );

表已创建。

SQL> INSERT INTO T_PART_LIST

2  SELECT OWNER, SEGMENT_NAME, TABLESPACE_NAME, SEGMENT_TYPE

3  FROM DBA_SEGMENTS;

已创建5628行。

SQL> COMMIT;

提交完成。

一般来说,我们不会执行下面的这种SQL:

SQL> ALTER TABLE T_PART_LIST

2  MODIFY PARTITION P2

3  ADD VALUES ('USERS');

ALTER TABLE T_PART_LIST

*

第1行出现错误:

ORA-14312:值'USERS'已经存在于分区3中

显然键值’USERS’对应的是另一个分区,这时只需要进行MERGE PARTITIONS操作就可以了:

SQL> ALTER TABLE T_PART_LIST

2  MERGE PARTITIONS P2, P3

3  INTO PARTITION P2;

表已更改。

SQL>COLTABLE_NAME FORMAT A15

SQL>COLPARTITION_NAME FORMAT A15

SQL>COLHIGH_VALUE FORMAT A30

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE

2  FROM USER_TAB_PARTITIONS

3  WHERE TABLE_NAME = 'T_PART_LIST';

TABLE_NAME      PARTITION_NAME  HIGH_VALUE

--------------- --------------- ------------------------------

T_PART_LIST     P1              'SYSTEM'

T_PART_LIST     P2              'USERS', 'YANGTK'

T_PART_LIST     P4              DEFAULT

这种ADD VALUES的需求很容易解决。更容易出现的需求类型下面的SQL:

SQL> ALTER TABLE T_PART_LIST

2  MODIFY PARTITION P1

3  ADD VALUES ('SYSAUX');

ALTER TABLE T_PART_LIST

*

第1行出现错误:

ORA-14324:所要添加的值已存在于DEFAULT分区之中

SQL> SELECT DISTINCT TABLESPACE_NAME

2  FROM T_PART_LIST PARTITION (P4);

TABLESPACE_NAME

------------------------------

SYSAUX

UNDOTBS1

对于这种情况,就没有办法使用一个SQL来完成操作了,需要先对DEFAULT分区进行SPLIT,然后再进行MERGE:

SQL> ALTER TABLE T_PART_LIST

2  SPLIT PARTITION FOR('SYSAUX')

3  VALUES ('SYSAUX')

4  INTO (PARTITION P3, PARTITION P4);

表已更改。

SQL> ALTER TABLE T_PART_LIST

2  MERGE PARTITIONS FOR('SYSTEM'), FOR('SYSAUX')

3  INTO PARTITION P1;

表已更改。

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE

2  FROM USER_TAB_PARTITIONS

3  WHERE TABLE_NAME = 'T_PART_LIST';

TABLE_NAME      PARTITION_NAME  HIGH_VALUE

--------------- --------------- ------------------------------

T_PART_LIST     P1              'SYSAUX', 'SYSTEM'

T_PART_LIST     P2              'USERS', 'YANGTK'

T_PART_LIST     P4              DEFAULT

同样,DROP VALUES对于包含数据的情况也需要两个步骤:

SQL> ALTER TABLE T_PART_LIST

2  MODIFY PARTITION FOR('USERS')

3  DROP VALUES ('USERS');

ALTER TABLE T_PART_LIST

*

第1行出现错误:

ORA-14518:分区包含的某些行对应于已删除的值

SQL> ALTER TABLE T_PART_LIST

2  SPLIT PARTITION FOR ('USERS')

3  VALUES ('USERS')

4  INTO (PARTITION P3, PARTITION P2);

表已更改。

SQL> ALTER TABLE T_PART_LIST

2  MERGE PARTITIONS FOR('USERS'), FOR('THE OTHERS')

3  INTO PARTITION P4;

表已更改。

SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE

2  FROM USER_TAB_PARTITIONS

3  WHERE TABLE_NAME = 'T_PART_LIST';

TABLE_NAME      PARTITION_NAME  HIGH_VALUE

--------------- --------------- ------------------------------

T_PART_LIST     P1              'SYSAUX', 'SYSTEM'

T_PART_LIST     P2              'YANGTK'

T_PART_LIST     P4              DEFAULT

当然这里说的DROP VALUES的操作是指将’USERS’键值从分区P2中去掉,而对应的数据需要回到DEFAULT分区中,并不是要删除这部分的数据。

如果要删除数据,那么有两个不同的方法,一个方法就是用DELETE语句直接删除对应的数据,然后再利用DROP VALUES语句清除分区上的定义。这种方面的缺点是包含DML操作,会产生大量的REDO和UNDO,只适用于数据量不大的情况。另外一个方法仍然是先进行SPLIT分区的操作,虽然第二步的使用使用DROP PARTITION代替MERGE PARTITIONS操作。

oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html

转载于:https://blog.51cto.com/19880614/1216387

oracle列表分区ADD VALUES或DROP VALUES包含数据变化相关推荐

  1. oracle分区属于什么知识,详细讲解Oracle表分区的相关概念及其优点

    Oracle 8i以后推出了分区选项.分区将表分离在若于不同的表空间上,用分而治之的方法来支撑元限膨胀的大表,组大表在物理一级的可管理性.将大表分割成较小的分区可以改善表的维护.备份.恢复.事务及查询 ...

  2. Oracle表分区详细说明

    Oracle表分区 自从oracle8i 开始可以把一个表分割为多个小的部分,这样可以对oracle的性能优化带来很大的好处~ 例如:改善表的查询性能,更加容易管理表数据,备份和恢复操作更方便 在or ...

  3. oracle表分区详解

    此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. (1.) 表空间及分区 ...

  4. oracle 表分区[三]

    Oracle中提供了对表进行分区的机制,通过表分区,可以将表空间中数据按照某种方式分别存放到特定的分区中. 表分区的作用:平衡 IO 操作,分区均匀,提高效率. Oracle中表分区方法有:范围分区法 ...

  5. 数据库表设计、 数据库分层、myslq水平拆分、oracle表分区

    数据库表设计 数据库表结构设计方法及原则(li)数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的 ...

  6. (转)oracle表分区详解

    此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. (1.) 表空间及分区 ...

  7. Oracle表分区大全

    废话少说,直接讲分区语法. Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区. 一:范围分区 就是根据数据库表中某一字段的值的范围来划分分区,例如: Sql****代码[[图片上传失 ...

  8. oracle sql 分区查询语句_Oracle SQL调优之分区表

    一.分区表简介 分区通过让您将它们分解为更小且更易于管理的分区(称为分区)来解决支持非常大的表和索引的关键问题.不需要修改SQL查询和DML语句以访问分区表.但是,在定义分区之后,DDL语句可以访问和 ...

  9. oracle 表分区 date,ORACLE分区表的使用和管理

    1创建和使用分区表 Oracle分区表分为四类:范围分区表:列表分区表:哈希分区表:组合分区表 范围分区表 创建一个按字段数据范围分区的表,分区置于指定的不同表空间中 示例代码: --为各个分区准备独 ...

  10. oracle 表分区

                表 分 区 学 习 笔 记 目 录 一.什么是表分区... 2 1.分区主要有两种形式... 2 2.表空间... 2 3.分区... 2 4.分区与分表... 2 二.为什么 ...

最新文章

  1. 深度解析MegEngine亚线性显存优化技术
  2. The alias LM/W3SVC/1/Root/XX already exists. Please choose a different alias
  3. JavaScript 面试中常见算法问题详解
  4. 当阳一中2021高考成绩查询,宜昌2021高考最高分多少分,宜昌历年高考状元资料
  5. F-Stack实现UDP服务端、客户端,并进行吞吐量测试的实现
  6. 虚拟法庭、云端判案...法律行业背后的智能技术革新
  7. [境内法规]中国人民银行关于分支行反洗钱工作的指导意见—银发[2005]56号
  8. Win11如何进行重置电脑初始化
  9. java 导出word_java导出生成word
  10. Java -- Ajax异步访问数据库内容
  11. [笔试编程-手撕代码]给定一个只包含大写英文字母的字符串s,求对s重新排列的所有不同的排列数,包含该输入的字符串本身
  12. 第五章 7-1 输出星期名缩写
  13. 微信支付宝支付如何盈利?盈利如何?
  14. 为何选用F1值(调和平均数)衡量P与R?
  15. Hypermesh-laminate复合材料案例学习笔记
  16. DEDE(织梦)插件开发案例(一)
  17. 【C++新手教程】C++ 循环
  18. 如何下载和配置php,如何下载和配置phpmyadmin
  19. 上海一女子楼道内被捅死 目前警方已介入调查
  20. pikachu靶机安装

热门文章

  1. Machine Learning - XII. Support Vector Machines支持向量机(Week 7)
  2. matlab动态显示鼠标值,动态显示鼠标的坐标值和像素值
  3. 一定质量的封闭气体被压缩后_螺杆压缩机转子型线设计原则及发展过程
  4. cmd无法运行python_为什么CMD无法运行python程序
  5. 白素雅 中国科学院大学 计算机应用技术,张玉清 - 中国科学院大学 - 计算机科学与技术学院...
  6. kali怎么进入root用户_ubuntu系统密码忘了怎么办(root或一般用户)
  7. 蓝桥杯2017年第八届C/C++省赛B组第二题-等差素数列
  8. Dart基础第2篇:变量、常量、命名规则、入口方法的两种定义方式
  9. eNSP进行配置网络模拟网络联通
  10. hosts文件修改完无效的解决办法