【发布时间】:2017-01-16 20:16:57
【问题描述】:
我正在尝试对数据库进行交换分区,但出现以下错误:ORA-14097: ALTER TABLE EXCHANGE PARTITION 中的列类型或大小不匹配
执行此操作的脚本已经创建,并且它在 Oracle 11g 数据库上按预期运行。一旦我更新到 12c,我就遇到了这个问题。这就是我进行分区交换的方式:
-- The new partitioned table.
CREATE TABLE NEW_TABLE
(
id NUMBER(18) NOT NULL,
message VARCHAR2(4000) NOT NULL,
details VARCHAR2(4000),
partition_time TIMESTAMP(6) DEFAULT to_timestamp('01-01-2016','dd-mm-yyyy HH24:MI') NULL
) NOCOMPRESS LOGGING
PARTITION BY RANGE (partition_time) INTERVAL (NUMTODSINTERVAL(1,'HOUR'))
(PARTITION initial VALUES LESS THAN (to_timestamp('01-01-2016','dd-mm- yyyy HH24:MI')));
-- The old table.
CREATE TABLE OLD_TABLE
(
id NUMBER(18,0) NOT NULL,
message VARCHAR2(4000 byte) NOT NULL,
details VARCHAR2(4000),
);
-- Add the column that does not exist on the old table (keep the same columns).
ALTER TABLE OLD_TABLE ADD partition_time TIMESTAMP(6) DEFAULT to_timestamp('01-01-2016','dd-mm-yyyy HH24:MI') NULL;
ALTER TABLE NEW_TABLE
EXCHANGE PARTITION INITIAL
WITH TABLE OLD_TABLE
WITHOUT VALIDATION;
(...)
现在,在 Oracle 11g 上,这再次完美运行。在 Oracle 12c 上,我遇到了上述错误。我做了一些研究,我看到人们谈论 INVISIBLE 列。好吧,我重新创建了 OLD_TABLE,所以我认为不会有不可见的列。
编辑:
我意识到,在 Oracle 12c 上,当我尝试更改表以创建新列时,会创建另一个不可见列(名为 SYS_NC00011$)。这就是分区交换不起作用的原因。我现在的问题是为什么会发生这种情况以及“删除此列”的最佳方法是什么?已经尝试删除未使用的列,但没有成功。
谢谢你们!
【问题讨论】:
-
难道你有一个列组来支持相关的统计数据?