2012-10-03 78 views
0

我因爲有一個主鍵設置爲自動增量和獨特的關鍵,這只是唯一一個相當糟糕的結構表。從概念上講,UNIQUE鍵應該是主鍵,但是在桌子構建時,誰創建了表都沒有UNQIUE鍵的列信息。MySQL的LOAD DATA INFILE問題與更新+插入

現在,我們需要開始做定期更新這個表,其中所提供的文本文件包含更新的行和新行。如果在UNIQUE鍵中有一個匹配的值,我們的挑戰將是替換該行,並且只要它自動增量,我們實際上不關心主鍵本身。

但是,LOAD DATA INFILE的結構方式是它會重置我們已有的PK,這很糟糕 - 我們保留PK的原因是它是其他舊錶(Sigh ..的外鍵。 )。

所以...有沒有辦法可以讓一個優雅的只有SQL更新腳本讀取更新表以文本形式和只會更新基於獨特的鍵列,而不搞砸了的PK?

我想一個解決辦法是將表導出到選項卡的形式,做VLOOKUP分配與匹配PK值的行(或NULL,如果它是一個新行)。

任何輸入?

編輯:有人建議我做負載DATE INFILE到一個臨時表中,然後從那裏做INSERT/UPDATE。基於什麼this post和後說,這裏是我建議的腳本:

// Create temporary table 
CREATE TABLE tmp { 
// my specifications 
} 

// Load into temporary table 
LOAD DATA LOCAL INFILE *'[my tab file]'* 
REPLACE INTO TABLE *mytable* FIELDS TERMINATED BY '\t' ENCLOSED BY '"' LINES TERMINATED BY '\r\n'; 

// Set copy all the columns over except the PK column. This is for rows with existing UNIQUE values 
UPDATE mytable 
RIGHT JOIN tmp ON mytable.unique = tmp.unique 
SET mytable.col1 = tmp.col1, ..., mytable.coln = tmp.coln, mytable.unique = tmp.unique; 

// Now insert the rows with new UNIQUE values 
INSERT IGNORE INTO mytable (mytable.col1, mytable.col2, ...) 
SELECT tmp.col1, tmp.col2, ... FROM tmp 

// Delete the temporary table now. 
DROP tmp; 

EDIT2:我更新了上面的查詢,並進行了測試。它應該工作。有什麼意見?

+0

你有一個sql轉儲,你需要合併一個表,但你不確定轉儲是否有有效的信息? –

+0

如果UNIQUE中存在匹配的值,那麼挑戰是替換該行 - 這是一個挑戰嗎?只要看看你是否有鑰匙在桌子上,並把你有什麼從文件中的表格!我無法理解你的問題。 –

+0

這是因爲有一個傳統的AUTO INCREMENT PK是特定於當前DB的。如果我使用匹配的UNIQUE鍵導入一行,它將改變PK的值,因爲轉儲沒有該PK。 –

回答

0

您可以使用LOAD DATA INFILE將數據加載到新表中。然後使用INSERT,UPDATE語句來更改表中的數據,在這種情況下,您可以根據需要鏈接表 - 通過主/唯一鍵或任何字段。

+0

很酷。我之前聽說過這個技巧。但是,如何在指定列的基礎上執行表寬INSERT-UPDATE?我可以在PHP中做到這一點,但只想堅持MySQL。 –

+0

其實,我有一個想法,請參閱原文中的編輯。 –