在交换分区时,交换的记录是否保留在原始分区中?

时间:2013-09-25 09:46:59

标签: sql oracle partitioning

假设,我有以下表格,

create table SRC_TABLE (
ID NUMBER(2),
NAME VARCHAR(20)
) PARTITION BY LIST (ID)
(
    PARTITION "PART_1" VALUES(1),
    PARTITION "PART_2" VALUES(2)
)

以下是SRC_TABLE中的记录

ID         NAME    
-----  ------- 
1          src1    
1          src11   
1          src111  
2          src2    
2          src22  

和其他临时表,

create table STAGE_TABLE (
ID NUMBER(2),
NAME VARCHAR(20)
)

以下是STAGE_TABLE中的记录:

ID     NAME    
-----  ------- 
2      2src22  

在运行以下查询时,

ALTER TABLE "SRC_TABLE" EXCHANGE PARTITION "PART_1" WITH TABLE "STAGE_TABLE" WITHOUT VALIDATION

SRC_TABLE成为数据:

ID     NAME    
-----  ------- 
2      2src22  
2      src2    
2      src22 

那么,现在名称为''2src22'的记录(由于交换而来自舞台表)仍保留在PART_1或PART_2中,因为基于ID它应该在PART_2中出现?

1 个答案:

答案 0 :(得分:5)

当您使用WITHOUT VALIDATION子句时,您告诉Oracle:“如果新记录满足分区子句,请不要检查新记录,我确保它们都满足分区方案< /强>”。

基本上,您已经在数据库中引入了损坏的数据,并且您告诉Oracle不要执行任何检查。您故意停用保护,因此记录自然会在错误的分区中结束:

SQL> select * from src_table partition (part_1);

 ID NAME
--- ------------------------------------------------------------
  2 2src22

如果您将数据放在错误的分区中,我确定您会遇到有趣的错误。某些选择可能会返回不一致/错误的结果。您可能还会遇到异常错误消息。

例如,简单的分区修剪会产生错误的结果(感谢@Alex Poole):

SQL> SELECT * FROM src_table WHERE ID = 1;

 ID NAME
--- ------------------------------------------------------------
  2 2src22

如果您实际使用验证会发生什么:

SQL> ALTER TABLE "SRC_TABLE" EXCHANGE PARTITION "PART_1" WITH TABLE STAGE_TABLE;

ORA-14099: all rows in table do not qualify for specified partition

您收到一条错误消息,说明您正在尝试做错事。不要尝试通过停用保护来解决错误消息。改为纠正您的数据。