星期五, 8月 23, 2013

Informix外部表重複導入資料問題(primary key duplicated)

Informix外部表重複導入資料問題

Ref: http://www.informixchina.net/home/space.php?uid=4585&do=blog&id=1821

 

Informix的外部表(external table)是從11.5 xC6開始的新特性,使用外部表可以實現資料的快速導入和匯出。外部表支援檔和具名管道兩種方式。且支持所有的informix資料類型。想要瞭解informix外部表的這裡給出一個連結:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1003externaltableids/index.html

但這裡主要討論的不是外部表的使用方法。而是介紹外部表中如何解決導入資料重複的問題。informix的外部表預設情況下如果導入資料中存在重復資料且表上存在約束則會出現無法導入且無錯誤提示的問題,如下例所示:

1.
創建表
create table ext_t
  (
    groupnumber char(10),
    phoneno char(10),
    isdnnumber char(18),
    stopdate char(8),
    begindate char(8),
    primary key (groupnumber,phoneno)
)extent size 256000 next size 50000 lock mode row;

create unique index idx1 on ext_t
    (isdnnumber) using btree;
create index idx2 on ext_t
    (groupnumber) using btree;
create index idx3 on ext_t
    (begindate) using btree;
create index idx4 on ext_t
    (stopdate) using btree;
2.
創建外部表
drop table if exists ext;

create external table ext
(
    groupnumber char(10),
    phoneno char(10),
    isdnnumber char(18),
    stopdate char(8)
        default '29991231',
    begindate char(8)
)
using
(
datafiles ("DISK:/home/informix/ext/ext_1.unl"),
          -- "DISK:/home/informix/external/mvpn_phone_2.unl"),
format "delimited",
DELIMITER "|",
deluxe,
rejectfile "/home/informix/ext/ext_rejfile.err",
maxerrors 100
);
3.
導入與約束相衝突的資料
假設導入如下所示的資料,其中後兩行資料出現導入與約束衝突:
2|2|2|2|2|
1|1|1|1|1|
1|1|1|1|1|
導入資料後則會產生如下所示的錯誤:
  239: Could not insert new row - duplicate value in a UNIQUE INDEX column (Unique Index:idx1).

  100: ISAM error:  duplicate value for a record with unique key.
Error in line 3
Near character position 44
資料無法導入且不會產生reject檔。
4.
重新導入數據
set constraints, indexes for ext_t filtering;
start violations table for ext_t;
insert into ext_t select * from ext;
set constraints, indexes for ext_t enabled;
stop violations table for ext_t;
此時系統會產生ext_t_diaext_t_vio兩個表,資料可以正常導入,而違反約束條件的資料則會被插入到ext_t_vio表中。這裡應注意的是,上面兩個表是由系統產生的表,操作結束後應將這兩個表刪除。

總結
   
使用外部表進行資料的導入匯出可以提高效率、減少時間。但對於不滿足約束條件的資料行,直接的方法可能會導致資料導入的失敗,使用本文介紹的這種方法可以將違反約束的行過濾掉從而保證正常的資料可以插入

沒有留言:

LinkWithin-相關文件

Related Posts Plugin for WordPress, Blogger...