根据外部csv文件中的内容更新现有的sql表?

时间:2014-04-03 03:39:37

标签: mysql sql phpmyadmin jointable

我有一张这样的表:

密钥名称地址

1 aaa * *

2 abc * *

3 bdc * *

4 cda * *

5 dda * * ...........

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

名称电话

abc * *

dda * *

aaa * *

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

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

感谢。

1 个答案:

答案 0 :(得分:14)

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

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 行,请在LINES TERMINATED行之后添加以下行。

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;