假设,我有以下表格,
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中出现?
答案 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
您收到一条错误消息,说明您正在尝试做错事。不要尝试通过停用保护来解决错误消息。改为纠正您的数据。