oracle列表分区ADD VALUES或DROP VALUES包含数据变化
在介绍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包含数据变化相关推荐
- oracle分区属于什么知识,详细讲解Oracle表分区的相关概念及其优点
Oracle 8i以后推出了分区选项.分区将表分离在若于不同的表空间上,用分而治之的方法来支撑元限膨胀的大表,组大表在物理一级的可管理性.将大表分割成较小的分区可以改善表的维护.备份.恢复.事务及查询 ...
- Oracle表分区详细说明
Oracle表分区 自从oracle8i 开始可以把一个表分割为多个小的部分,这样可以对oracle的性能优化带来很大的好处~ 例如:改善表的查询性能,更加容易管理表数据,备份和恢复操作更方便 在or ...
- oracle表分区详解
此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. (1.) 表空间及分区 ...
- oracle 表分区[三]
Oracle中提供了对表进行分区的机制,通过表分区,可以将表空间中数据按照某种方式分别存放到特定的分区中. 表分区的作用:平衡 IO 操作,分区均匀,提高效率. Oracle中表分区方法有:范围分区法 ...
- 数据库表设计、 数据库分层、myslq水平拆分、oracle表分区
数据库表设计 数据库表结构设计方法及原则(li)数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的 ...
- (转)oracle表分区详解
此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. (1.) 表空间及分区 ...
- Oracle表分区大全
废话少说,直接讲分区语法. Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区. 一:范围分区 就是根据数据库表中某一字段的值的范围来划分分区,例如: Sql****代码[[图片上传失 ...
- oracle sql 分区查询语句_Oracle SQL调优之分区表
一.分区表简介 分区通过让您将它们分解为更小且更易于管理的分区(称为分区)来解决支持非常大的表和索引的关键问题.不需要修改SQL查询和DML语句以访问分区表.但是,在定义分区之后,DDL语句可以访问和 ...
- oracle 表分区 date,ORACLE分区表的使用和管理
1创建和使用分区表 Oracle分区表分为四类:范围分区表:列表分区表:哈希分区表:组合分区表 范围分区表 创建一个按字段数据范围分区的表,分区置于指定的不同表空间中 示例代码: --为各个分区准备独 ...
- oracle 表分区
表 分 区 学 习 笔 记 目 录 一.什么是表分区... 2 1.分区主要有两种形式... 2 2.表空间... 2 3.分区... 2 4.分区与分表... 2 二.为什么 ...
最新文章
- 深度解析MegEngine亚线性显存优化技术
- The alias LM/W3SVC/1/Root/XX already exists. Please choose a different alias
- JavaScript 面试中常见算法问题详解
- 当阳一中2021高考成绩查询,宜昌2021高考最高分多少分,宜昌历年高考状元资料
- F-Stack实现UDP服务端、客户端,并进行吞吐量测试的实现
- 虚拟法庭、云端判案...法律行业背后的智能技术革新
- [境内法规]中国人民银行关于分支行反洗钱工作的指导意见—银发[2005]56号
- Win11如何进行重置电脑初始化
- java 导出word_java导出生成word
- Java -- Ajax异步访问数据库内容
- [笔试编程-手撕代码]给定一个只包含大写英文字母的字符串s,求对s重新排列的所有不同的排列数,包含该输入的字符串本身
- 第五章 7-1 输出星期名缩写
- 微信支付宝支付如何盈利?盈利如何?
- 为何选用F1值(调和平均数)衡量P与R?
- Hypermesh-laminate复合材料案例学习笔记
- DEDE(织梦)插件开发案例(一)
- 【C++新手教程】C++ 循环
- 如何下载和配置php,如何下载和配置phpmyadmin
- 上海一女子楼道内被捅死 目前警方已介入调查
- pikachu靶机安装
热门文章
- Machine Learning - XII. Support Vector Machines支持向量机(Week 7)
- matlab动态显示鼠标值,动态显示鼠标的坐标值和像素值
- 一定质量的封闭气体被压缩后_螺杆压缩机转子型线设计原则及发展过程
- cmd无法运行python_为什么CMD无法运行python程序
- 白素雅 中国科学院大学 计算机应用技术,张玉清 - 中国科学院大学 - 计算机科学与技术学院...
- kali怎么进入root用户_ubuntu系统密码忘了怎么办(root或一般用户)
- 蓝桥杯2017年第八届C/C++省赛B组第二题-等差素数列
- Dart基础第2篇:变量、常量、命名规则、入口方法的两种定义方式
- eNSP进行配置网络模拟网络联通
- hosts文件修改完无效的解决办法