4

次のテーブルがあるとします。

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 

これで、name = '2src22' のレコード (交換の結果としてステージ テーブルから取得されたもの) は、ID に基づいて PART_2 にあるはずなので、PART_1 または PART_2 に残りますか?

4

1 に答える 1

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

何か間違ったことをしようとしていることを説明する素晴らしいエラー メッセージが表示されます。保護を無効にしてエラー メッセージを回避しようとしないでください。代わりにデータを修正してください。

于 2013-09-25T10:09:51.710 に答える