默认情况下,oracle的分区表对于分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错——ORA-14402: 更新分区关键字列将导致分区的更改。但是可以通过打开表的row movement属性来允许对分区字段的update操作。

例:创建分区表test_part进行实验

create table TEST_PART
(
  A1 NUMBERnot null,
  A2 DATE      not null,
  A3 VARCHAR2(6) not null,
  A4 DATE not null,
  A5 NUMBER not null,
)
partition by range (A1)
(
  partition P1 values less than (1000),
  partition P2 values less than (2000),
  partition P3 values less than (3000),
  partition P4 values less than (4000),
  partition P5 values less than (5000),
  partition P6 values less than (MAXVALUE)
);

插入如下的数据
SQL> select * from test_part;

A1 A2          A3     A4                  A5
---------- ----------- ------ ----------- ----------
       123 2006-06-30  123456 2006-06-30         123
       456 2006-06-30  asdfgh 2006-06-30         456
         1 2006-06-30  234123 2006-06-30           1
         2 2006-06-30  234234 2006-06-30           2
      1234 2006-06-30  456789 2006-06-30        1234
      1111 2006-06-30  ewrqwe 2006-06-30        1111
      2222 2006-06-30  fdafda 2006-06-30        2222
      3333 2006-06-30  342342 2006-06-30        3333
      5678 2006-06-30  qwerty 2006-06-30        5678

9 rows selected

分区P1、P2的数据分别为:
SQL> select rowid,t.* from test_part partition(p1) t;

ROWID                      A1 A2          A3     A4                  A5
------------------ ---------- ----------- ------ ----------- ----------
AAAGLoAAGAAAtsEAAB        456 2006-06-30  asdfgh 2006-06-30         456
AAAGLoAAGAAAtsEAAC          1 2006-06-30  234123 2006-06-30           1
AAAGLoAAGAAAtsEAAD          2 2006-06-30  234234 2006-06-30           2
AAAGLoAAGAAAtsEAAE        123 2006-06-30  123456 2006-06-30         123

SQL> select rowid,t.* from test_part partition(p2) t;

ROWID                      A1 A2          A3     A4                  A5
------------------ ---------- ----------- ------ ----------- ----------
AAAGLwAAGAAA+8MAAC       1234 2006-06-30  456789 2006-06-30        1234
AAAGLwAAGAAA+8MAAD       1111 2006-06-30  ewrqwe 2006-06-30        1111

直接update提示错误
SQL> update test_part set a1=1123 where a1=123;

update test_part set a1=1123 where a1=123

ORA-14402: 更新分区关键字列将导致分区的更改

打开row movement属性
SQL> alter table test_part enable row movement;

Table altered

再次执行update操作
SQL> update test_part set a1=1123 where a1=123;

1 row updated

执行是成功的并迁移到分区P2上了,且这时候rowid也发生了变化
SQL> select rowid,t.* from test_part partition(p2) t;

ROWID                      A1 A2          A3     A4                  A5
------------------ ---------- ----------- ------ ----------- ----------
AAAGLwAAGAAA+8MAAC       1234 2006-06-30  456789 2006-06-30        1234
AAAGLwAAGAAA+8MAAD       1111 2006-06-30  ewrqwe 2006-06-30        1111
AAAGLwAAGAAA+8PAAB       1123 2006-06-30  123456 2006-06-30         123

SQL>

enable row movement可以允许数据段的压缩、update分区字段的数据(跨分区的)

但是,也是有限制性的:对于普通表(heap-organized)行迁移后rowid会发生变化,对于索引表(index-organized)rowid虽然依然有效,但是其实际对应的物理构成是错误的。

来源:http://happyhou.blog.sohu.com/56897089.html

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

Question: Why am I getting an ora-14402 error when I update a partition key 
Answer: You cannot update the value of the partition key, the only way you can go about this is by deleting the old row and adding a new row to the table

the rowid changes - it is just like delete + insert
--- from tom.

I came to this page after getting the "ORA-14402: updating partition key column 
would cause a partition change" error message.  I then tried ALTER TABLE xYz 
ENABLE ROW MOVEMENT and, like a miracle, my problems fizzled away!  I learnt a 
new thing too after 15 years of using oracle.  Thanks Tom.

ROW MOVE确实会影响LOGMNR的使用,我刚刚测试过。

SELECT OPERATION, SQL_UNDO, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE OPERATION = 'UPDATE'
AND USERNAME = 'YANGTK' AND SEG_OWNER = 'YANGTK'

OPERATION
--------------------------------
SQL_UNDO
----------------------------------------------------------------------------------------------------
SQL_REDO
----------------------------------------------------------------------------------------------------
UPDATE
update "YANGTK"."TEST_PART" set "ID" = '20' where "ID" = '120' and ROWID = 'AAABkdAAGAAAABeAAA';
update "YANGTK"."TEST_PART" set "ID" = '120' where "ID" = '20' and ROWID = 'AAABkdAAGAAAABeAAA';

UPDATE
update "YANGTK"."TEST_PART" set "ID" = '120' where "ID" = '20' and ROWID = 'AAABkWAAGAAAABiAAA';
update "YANGTK"."TEST_PART" set "ID" = '20' where "ID" = '120' and ROWID = 'AAABkWAAGAAAABiAAA';

这是V$LOGMNR_CONTENTS的查询结果。这时的UNDO信息中指定的ROWID都是错误的。

来源:http://www.itpub.net/thread-283642-2-1.html

ORA-14402: 更新分区关键字列将导致分区的更改相关推荐

  1. ORA-14402:更新分区关键字列将导致分区更改(分区表注意)

    建立完分区表后一定要和开发确认一点,就是是否会修改分区字段.因为update分区字段到其他分区时候,会报错. 解决办法:开启表的行转移功能 alter table XX enable row move ...

  2. Oracle表的分区update卡着,分区表分区字段的update操作

    默认情况下,oracle的分区表对于分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错--ORA-14402: 更新分区关键字列将导致分区的更改.但是可以通过打开表的r ...

  3. MaxCompute分区和列操作

    MaxComputeSQL DDL语句-分区和列操作 添加分区 为已存在的分区表新增分区. 限制条件 MaxCompute单表支持的分区数量上限为6万个. 对于有多级分区的表,如果需要添加新的分区值, ...

  4. 阿里云开发中分区和列操作

    分区和列操作 分区操作 添加分区 删除分区 修改分区的更新时间 修改分区值 合并分区 清空分区数据 列操作 添加列或注释 删除列 更改列数据类型 修改列的顺序 修改列名 修改列注释 修改列名及注释 修 ...

  5. 分区表(表分区的具体作用、什么时候需要分区、表分区的优点)、表分区的几种类型及操作方法(range/hash/list/虚拟列/Interval/组合分区)、普通表转分区表的方法、分区表的其它操作

    文章目录 分区表(谨慎使用,了解即可) 表空间及分区表的概念 表分区的具体作用 什么时候需要分区 表分区的优点 表分区的几种类型及操作方法 范围分区(range) 哈希分区(hash) 列表分区(li ...

  6. mysql分区字段创建索引_MySQL分区字段列有必要再单独建索引吗?

    前言 大家都知道对于分区字段必须是主键的一部分,那么建了复合主键之后,是否需要对分许字段再单独添加一个索引呢?有没有效果?来验证一下,下面话不多说了,来一起看看详细的介绍吧. 1.新建表effect_ ...

  7. ora-14400插入的分区关键字未映射到任何分区---oracle数据库表过期问题

    楼主解决这个问题ora-14400插入的分区关键字未映射到任何分区,其原因是:分区表过期. 通过使用sql直接修改Date类型的字段可以证实,修改成过期以后的时间出现下列提示,修改成过期之前的则可以. ...

  8. 【客户下单】后台系统匹配分区关键字实现自动分单

    [客户下单]后台系统基于分区关键字匹配实现自动分单 通过前端传递过来的"省市区",找到区域,在通过区域找到分区,将客户发货地址与分区的关键字进行匹配,如果包含分区的关键字或辅助关键 ...

  9. android sqlite更改数据,更新现有的sqlite数据库中的列,但没有任何更改android

    对不起,但我没有在网上找到任何东西.我在我的目录"资产"中使用现有的数据库.当我想更新一列时,函数返回该列已经改变,但实际上并没有发生.我试着用execSQL,但没有再次.更新现有 ...

最新文章

  1. “十四五”大数据产业发展锚定3万亿目标
  2. 博客园 noteless 全部文章 目录索引
  3. 最长上升子序列问题 (LIS)
  4. java面向对象高级分层实例_数据库操作类
  5. Yahoo Web UIs——Java开发者丰富的Web UI
  6. 【lr12安装】安装过程中.netframe安装不上,报错0x800F081F
  7. 15款免费远程控制软件下载
  8. Dell Inspiron 14 3437装win7系统没有网卡驱动解决办法
  9. ue设置注释快捷键_UE编辑器快捷键大全 UltraEdit快捷键有哪些
  10. html5个人记账网页源代码,蓝色的cms企业记账管理后台模板源码
  11. 使用RMF报表设计器进行报表设计
  12. 1.5 极限的存在准则和两个重要极限
  13. Python输出 计算器 !
  14. 从csv文件中导入数据到MySQL数据库
  15. 吉米_王:浅谈深拷贝和浅拷贝异同点
  16. .net RPC框架选型(一)
  17. uniapp 中 通过经纬度获取地址详情(vue)
  18. angularjs结合plupload实现文件上传
  19. 后端的一个刚毕业的小伙子老早完成了架构和服务端逻辑,接口洋洋洒洒列了出来。。。...
  20. 51单片机串口通信模板_51单片机串口通信(字符串接收和发送)(示例代码)

热门文章

  1. Ps 与 3D LUT Creator 联动方法
  2. spark之OOM常见问题梳理(一)
  3. 几种输入字符串的方法
  4. 河北大学适合计算机考研吗,河北大学考研难吗?一般要什么水平才可以进入?...
  5. shopee最新最全店铺运营FAQ,从小白萌新到江湖大佬统统有效
  6. SpringBoot中使用Freemarker邮件模板生成邮件
  7. 【橙点同学】互联网农旅电商(初级)答案
  8. 超详细的新手React入门教程
  9. 光标选中多行_朋友圈发纯文字显示多行文字的技巧
  10. 创建一个score类