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

标签 mysql sql phpmyadmin jointable

我有一个这样的表:

键名地址

1 aaa **

2 abc **

3 bdc **

4 cda**

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

现在我有另一个像这样的平面文件(制表符分隔的 csv 文件):

姓名电话

abc **

dda **

啊啊啊**

这个平面文件将只有原始表中的部分条目。我想根据平面文件中的内容更新表(基本上是做一个连接)。目前我正在考虑写一些 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 行,请在 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;

关于mysql - 根据外部 csv 文件的内容更新现有的 sql 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22827402/

相关文章:

mysql - 将前缀添加到字段中现有值的 SQL 查询

php从json向mysql插入数据运行速度太慢

Mysql 查询不返回订单属性表上的空行

sql - 在 SP_OAMETHOD 中发送 json 值

java - 将输入日期字符串转换为 SQL 日期类型

sql - 触发编译错误原因

php - MySQL 中的自动递增停止了吗?

php - PHP SQL语句不起作用

mysql - 模拟/ stub /单元测试mysql流查询行 Node js

php - PHP 与 Mysql 的错误