0

我有一张桌子:

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

foo具有唯一索引。
我想将文件加载到此表中,按列汇总bar重复值:foo

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 |
4

1 回答 1

1

没有直接的方法可以实现您想要的,因为记录的来源来自文件而不是表。按照以下步骤插入新行或更新现有行。

  • 创建一个临时表,作为记录的临时目标表。
  • TempTable假设新表已命名并具有两列,则将记录加载到临时表中:foobar

表创建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,它基本上插入一条新记录,但如果记录与现有键冲突,它会更新记录。Akey应该首先定义,但在您的情况下,您可以直接执行该语句,因为您已经提到它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
于 2013-04-08T04:49:45.313 回答