是否根据外部CSV文件中的内容更新现有SQL表?

2022-02-23 00:00:00 sql mysql phpmyadmin jointable

我有一个这样的表:

密钥名称地址

1 AAA**

2ABC**

3 BDC**

4 CDA**

5 dda** .

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

命名电话

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 '	'
LINES TERMINATED BY '
'
(@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);

若要更新现有行,可以使用UPDATE WITH JOIN。

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

相关文章