Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 重复和#x27;使用“加载文件”时的值_Mysql_Duplicates_Load Data Infile_Sql Insert - Fatal编程技术网

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