我因爲有一個主鍵設置爲自動增量和獨特的關鍵,這只是唯一一個相當糟糕的結構表。從概念上講,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:我更新了上面的查詢,並進行了測試。它應該工作。有什麼意見?
你有一個sql轉儲,你需要合併一個表,但你不確定轉儲是否有有效的信息? –
如果UNIQUE中存在匹配的值,那麼挑戰是替換該行 - 這是一個挑戰嗎?只要看看你是否有鑰匙在桌子上,並把你有什麼從文件中的表格!我無法理解你的問題。 –
這是因爲有一個傳統的AUTO INCREMENT PK是特定於當前DB的。如果我使用匹配的UNIQUE鍵導入一行,它將改變PK的值,因爲轉儲沒有該PK。 –