Mysql 是否基于外部csv文件的内容更新现有sql表?

Mysql 是否基于外部csv文件的内容更新现有sql表?,mysql,sql,phpmyadmin,jointable,Mysql,Sql,Phpmyadmin,Jointable,我有一张这样的桌子: INSERT INTO tbl (name, phone, address) SELECT name, phone, address FROM tmp WHERE name NOT IN (SELECT name FROM table); 键名地址 1 aaa** 2 abc** 3 bdc** 4 cda** 5 dda** 现在我有了另一个平面文件(以制表符分隔的csv文件),如下所示: INSERT INTO tbl (name, phone, address)

我有一张这样的桌子:

INSERT INTO tbl (name, phone, address)
SELECT name, phone, address FROM tmp WHERE name NOT IN (SELECT name FROM table);
键名地址

1 aaa**

2 abc**

3 bdc**

4 cda**

5 dda**

现在我有了另一个平面文件(以制表符分隔的csv文件),如下所示:

INSERT INTO tbl (name, phone, address)
SELECT name, phone, address FROM tmp WHERE name NOT IN (SELECT name FROM table);
姓名电话

abc**

dda**

aaa**

此平面文件将仅包含原始表中的部分条目。我想根据平面文件中的内容更新表(基本上是进行连接)。目前我正在考虑编写一些php脚本来实现这一点。基本上,将平面文件作为数组加载,并让php代码执行实际的搜索和更新

有没有更简单/更好的方法来完成这项任务?有人建议使用一个名为phpmyadmin的工具,但它似乎无法处理这一级别的复杂任务


谢谢。

您可以创建一个临时表,将文件加载到其中,然后更新持久表

CREATE TEMPORARY TABLE tmp
(
   name varchar(255),
   phone varchar(255),
   address varchar(255)
   INDEX (name)
);

LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE tmp
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
(@name, @phone, @address)
SET
name = @name,
phone = @phone
address = @address;
如果要忽略csv的前n行,请在终止的行
后添加下面的行

IGNORE n LINES 
最后,根据临时行向表中添加/更新行

假设您要使用列名来标识csv中的行是否已经存在于表中,您可以执行以下操作:

INSERT INTO tbl (name, phone, address)
SELECT name, phone, address FROM tmp WHERE name NOT IN (SELECT name FROM table);
要更新现有行,可以使用带有JOIN的更新

UPDATE tbl a 
JOIN tmp b ON a.name = b.name 
SET a.phone = b.phone,
    a.address = b.address;