2013-04-08 41 views
0

時,我有一個表:總和重複的值,使用加載文件

| foo | bar | 
+-----+-----+ 
| abc | 4 | 
| def | 1 | 
| ghi | 2 | 

foo具有唯一索引。
我想foo列裝載文件到這個表總結重複的bar值:

abc \t 7 
ghi \t 3 
jkl \t 4 

有什麼辦法來總和重複行值時LOAD DATA

LOAD DATA LOCAL INFILE 'file.txt' REPLACE 
INTO TABLE `table` FIELDS TERMINATED BY '\t' (`foo`,`bar`); 

我想有這樣一個表:

| foo | bar | 
+-----+-----+ 
| abc | 11 | 
| def | 1 | 
| ghi | 5 | 
| jkl | 4 | 

回答

1

沒有直接的方式來實現你自源想要什麼
此命令連續替換舊值記錄來自文件而不是來自表格。按照此步驟插入新行或更新現有行。

  • 創建一個臨時表作爲記錄的臨時目標表。
  • 負荷記錄到臨時表假設新的表被命名爲TempTable,有兩列:foo,並bar

創建表的DDL:

CREATE TABLE TempTable 
(
    foo VARCHAR(30), 
    bar INT 
); 

LOAD DATA LOCAL INFILE 'file.txt' 
REPLACE INTO TABLE TempTable 
FIELDS TERMINATED BY '\t' (`foo`,`bar`); 
  • 記錄後一直加載,讓我們從記錄的組合開始。 MySQL實現了一個名爲INSERT...ON DUPLICATE UPDATE的功能,該功能基本上插入了一條新記錄,但是如果記錄與現有密鑰衝突,則會更新該記錄。 A key應該先定義,但在你的情況下,你可以直接執行語句,因爲你已經提到foo已經是唯一的。

使用INSERT INTO...SELECT你可以結合INSERT..ON DUPLICATE UPDATE

INSERT INTO YourExistingTable (Foo, Bar) 
SELECT Foo, Bar 
FROM TempTable 
ON DUPLICATE KEY UPDATE Bar = VALUES(Bar) + Bar; 
  • 記錄已執行的語句之後將被合併。您現在可以刪除臨時表。

刪除臨時表,

DROP TABLE TempTable