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

Abh*_*bhi 4 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)
)
Run Code Online (Sandbox Code Playgroud)

以下是SRC_TABLE中的记录

ID         NAME    
-----  ------- 
1          src1    
1          src11   
1          src111  
2          src2    
2          src22  
Run Code Online (Sandbox Code Playgroud)

和其他临时表,

create table STAGE_TABLE (
ID NUMBER(2),
NAME VARCHAR(20)
)
Run Code Online (Sandbox Code Playgroud)

以下是STAGE_TABLE中的记录:

ID     NAME    
-----  ------- 
2      2src22  
Run Code Online (Sandbox Code Playgroud)

在运行以下查询时

ALTER TABLE "SRC_TABLE" EXCHANGE PARTITION "PART_1" WITH TABLE "STAGE_TABLE" WITHOUT VALIDATION
Run Code Online (Sandbox Code Playgroud)

SRC_TABLE的数据成为:

ID     NAME    
-----  ------- 
2      2src22  
2      src2    
2      src22 
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*rat 5

当您使用该WITHOUT VALIDATION子句时,您告诉Oracle:"如果新记录满足分区子句,请不要检查新记录,我确保它们都满足分区方案 ".

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

SQL> select * from src_table partition (part_1);

 ID NAME
--- ------------------------------------------------------------
  2 2src22
Run Code Online (Sandbox Code Playgroud)

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

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

SQL> SELECT * FROM src_table WHERE ID = 1;

 ID NAME
--- ------------------------------------------------------------
  2 2src22
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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