我有一张这样的表:
密钥名称地址
1 aaa * *
2 abc * *
3 bdc * *
4 cda * *
5 dda * * ...........
现在我有另一个平面文件(制表符分隔的csv文件),如下所示:
名称电话
abc * *
dda * *
aaa * *
此平面文件只包含原始表中的部分条目。我想根据平面文件中的内容更新表(基本上是连接)。目前我正在考虑使用一些PHP脚本来做到这一点。基本上将该平面文件作为数组加载并使用php代码进行实际搜索和更新。
有没有更简单/更好的方法来完成这项任务?有人提出了一个名为phpmyadmin的工具,但似乎无法处理这一级别的复杂任务。
感谢。
答案 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;