2011-09-27 36 views
1

我需要從一個MySQL表導入數據到另一個。舊錶具有不同的過時結構(這不是非常相關)。也就是說,我將一個字段附加到名爲「imported_id」的新表中,該表保存舊錶中的原始ID,以防止重複導入舊記錄。如何緩解基於非鍵列的重複行插入?

我現在的問題是,我該如何防止重複?由於新系統與舊系統平行推出,不幸的是,需要運行多次導入。我無法創建「import_id」字段PK/UNIQUE,因爲它對於不是來自舊錶的字段將具有空值,從而在添加新字段時引發錯誤。有沒有辦法使用某種類型的INSERT IGNORE來實現一個本來不具有約束的任意列?

我覺得這個問題越多,我認爲我應該在最初的SELECT中處理它越多。但是,我一般會對處理這個問題的質量機制感興趣。

最好。

回答

2

您應該能夠在import_id列上創建一個唯一鍵,並將該列指定爲可空。只有主鍵列必須被指定爲NOT NULL。

這就是說,在新表時,可以指定的可爲空IMPORT_ID列的唯一密鑰,然後從舊錶插入使用ON DUPLICATE KEY

這裏的新表時,處理任何重複鍵錯誤,是一個基本的樣例什麼我開車在:

create table your_table 
(id int unsigned primary key auto_increment, 
someColumn varchar(50) not null, 
import_id int null, 
UNIQUE KEY `importIdUidx1` (import_id) 
); 



insert into your_table (someColumn,import_id) values ('someValue1',1) on duplicate key update someColumn = 'someValue1'; 
insert into your_table (someColumn) values ('someValue2'); 
insert into your_table (someColumn) values ('someValue3');; 
insert into your_table (someColumn,import_id) values ('someValue4',1) on duplicate key update someColumn = 'someValue4'; 

其中第一個和最後一個刀片從舊錶代表插入和第二和第三從別處代表插入。

希望這會有所幫助,祝你好運!

+0

無論出於何種原因,我的印象是你不能有一個NULL唯一字段。感謝這篇文章。 –