假设我有下表,
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中?
当使用该WITHOUT VALIDATION
子句时,您将告诉Oracle:“如果它们满足partition子句,请不要检查新记录,我已经确保它们都满足分区方案”。
基本上,您已经在数据库中引入了损坏的数据,并且已经告诉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
您会收到一条不错的错误消息,说明您正在尝试做错什么。不要尝试通过取消保护来解决错误消息。改正您的数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句