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

问题描述 投票:0回答:2

我有一张这样的桌子:

按键名称地址

1aaa**

2 abc **

3 下止点 **

4 CDA **

5 dda ** …………

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

姓名电话

abc **

**

啊啊**

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

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

谢谢。

mysql sql phpmyadmin join
2个回答
30
投票

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

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;

0
投票

首先创建类似这样的 TXT 文件,并将其命名为 data.txt 并将其保存在您的下载中。

sku_1、SPO1、Wea1、Bas1 sku_2、SPO2、Wea2、Bas2 sku_3、SPO3、Wea3、Bas3 sku_4、DAV4、Wea4、Bas4

然后在 SQL Server 中创建该数据将被插入的表,在本例中它是 DataTable

使用下面的 CMD 行将其复制到 SQL 表中。确保设置服务器数据库和凭据。

C:\Users senk\Downloads>data.txt 中的 bcp 数据表 -S server_ip_here -d 数据库名称_here -U 用户名_here -P 密码_here -q -c -t ","

© www.soinside.com 2019 - 2024. All rights reserved.