Mysql 重复和#x27;使用“加载文件”时的值
我有一张桌子:Mysql 重复和#x27;使用“加载文件”时的值,mysql,duplicates,load-data-infile,sql-insert,Mysql,Duplicates,Load Data Infile,Sql Insert,我有一张桌子: | foo | bar | +-----+-----+ | abc | 4 | | def | 1 | | ghi | 2 | foo具有唯一索引。 我想将一个文件加载到此表中,按foo列对重复项的bar值求和: abc \t 7 ghi \t 3 jkl \t 4 在加载数据期间,是否有方法对重复行中的值进行求和? 此命令将替换行中的旧值: LOAD DATA LOCAL INFILE 'file.txt' REPLACE INTO TABLE `table`
| foo | bar |
+-----+-----+
| abc | 4 |
| def | 1 |
| ghi | 2 |
foo
具有唯一索引。我想将一个文件加载到此表中,按
foo
列对重复项的bar
值求和:
abc \t 7
ghi \t 3
jkl \t 4
在加载数据期间,是否有方法对重复行中的值进行求和?
此命令将替换行中的旧值:
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 |
没有直接的方法来实现您想要的,因为记录的源来自文件而不是表。按照以下步骤插入新行或更新现有行
- 创建一个临时表,作为记录的临时目标表
- 假设新表名为
tentable
,并且有两列: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
的功能,它基本上会插入一条新记录,但如果记录与现有键冲突,它就会更新记录。应该首先定义键
,但在您的情况下,您可以直接执行该语句,因为您已经提到foo
是唯一的
使用插入到…选择
您可以在重复更新时组合插入
INSERT INTO YourExistingTable (Foo, Bar)
SELECT Foo, Bar
FROM TempTable
ON DUPLICATE KEY UPDATE Bar = VALUES(Bar) + Bar;
- 执行语句后,将合并这些记录。现在可以删除临时表
放下临时桌子
DROP TABLE TempTable