【說明】在進行對oralce的分區表的分區字段進行update操作的時候,就會報ORA-14402的錯誤,這種情況通過開啟表的行移動來避免錯誤的發生;
【場景模拟】
1、建立分區表SCOTT.EMP_BAK
CREATE TABLE EMP_BAK
(
EMPNO NUMBER(4),
ENAME VARCHAR2(10 BYTE),
JOB VARCHAR2(9 BYTE),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2),
DLVL NUMBER(2)
)
LOGGING
PARTITION BY LIST (DLVL)
SUBPARTITION BY LIST (DEPTNO)
PARTITION EMP_P1 VALUES (1)
( SUBPARTITION EMP1_SUB1 VALUES (10) TABLESPACE USERS,
SUBPARTITION EMP1_SUB2 VALUES (20) TABLESPACE USERS,
SUBPARTITION EMP1_SUB3 VALUES (30) TABLESPACE USERS ),
PARTITION EMP_P2 VALUES (2)
( SUBPARTITION EMP2_SUB1 VALUES (10) TABLESPACE USERS,
SUBPARTITION EMP2_SUB2 VALUES (20) TABLESPACE USERS,
SUBPARTITION EMP2_SUB3 VALUES (30) TABLESPACE USERS )
2、模拟報錯:對DEPTNO進行UPDATE的操作
SQL> update SCOTT.EMP_BAK SET DEPTNO=20 WHERE EMPNO=7782;
ORA-14402: updating partition key column would cause a partition change
3、啟動行遷移
SQL> alter table scott.EMP_BAK enable row movement;
4、重新執行操作
1 row updated.
5、關閉行遷移
SQL> alter table scott.EMP_BAK disable row movement;
報錯的了解:
分區表某一行更新時,如果更新的是分區列,并且更新後的列值不屬于原來的這個分區,update的操作就相當于把這行從這個分區中delete掉,并加到更新後所屬的分區。等同于delete+insert的操作;
在進行update操作的時候,相應行的rowid的值是會跟着變化的,如果沒有開啟row movement那麼肯定就更新不了。
【建議】在進行分區表操作的時候,需要跟業務進行溝通,作為分區條件的列,盡量不能改變;