使用 phpMyAdmin 将带有部分数据的制表符分隔的 csv 文件导入 mysql 表
Posted
技术标签:
【中文标题】使用 phpMyAdmin 将带有部分数据的制表符分隔的 csv 文件导入 mysql 表【英文标题】:import tab separated csv file with partial data into mysql table with phpMyAdmin 【发布时间】:2014-12-13 21:44:37 【问题描述】:我有一个大约 30 列的 mysql 表。 我有一个大约 10 列的 CSV 文件。
我想使用 phpMyAdmin 从数据库中的 CSV 文件更新数据,而不更改其余数据。
例如,MySQL 将是:
id, code, name, description, a, b, c, x, y, z
10, rbmls, Joe Blow, Neighbor, 100, 200, 500, 80, 800, 10
CSV 可能包含:
id[TAB]code [TAB]a [TAB]b [TAB]c
10[TAB]rbmls[TAB]10[TAB]300[TAB]0
我想通过 ID 匹配 CSV 和 MySQL 表中的数据,然后覆盖 MySQL 表中 CSV 中的数据,而不删除任何其他内容。
上述示例的预期结果是:
id, code, name, description, a, b, c, x, y, z
10, rbmls, Joe Blow, Neighbor, 10, 300, 0, 80, 800, 10
如何在 phpMyAdmin 中执行此操作?
【问题讨论】:
【参考方案1】:LOAD DATA INFILE
在末尾有一个列规范。 see here
LOAD DATA INFILE ...
INTO TABLE ...
FIELDS TERMINATED BY '\t'
IGNORE 1 LINES
(id, code, a, b, c)
来自 MySQL-Doc:
默认情况下,当 LOAD DATA INFILE 语句末尾没有提供列列表时,输入行应包含每个表列的字段。如果您只想加载表的某些列,请指定列列表: LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);
替代方案
将数据加载到临时表中,然后从那里向主表执行INSERT ... UPDATE
。类似的东西:
LOAD DATA INFILE ... INTO TABLE `temp` ...
INSERT INTO mainTable (id, code, a, b, c)
SELECT * FROM `temp`
ON DUPLICATE KEY UPDATE code=VALUES(code), a=VALUES(a), b=VALUES(b), c=VALUES(c);
见here
【讨论】:
我尝试了您的第一个解决方案,但似乎我做错了什么。我得到 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 4 行的 'LINE (id, code, a, b, c) 附近使用正确的语法。 这是LINES
不是LINE
,抱歉。我更新了我的答案。
谢谢,现在语法似乎是正确的,但我得到一个不同的错误:“#1045 - 访问被拒绝。”这似乎很奇怪,因为我已经登录到 phpMyAdmin 并且我只在尝试执行该语句时收到此消息。我使用托管解决方案,因此我无法完全访问配置文件。但是,我有一个面板来检查和更改我的权限,并且根据我所看到的,用户拥有执行我想做的事情的所有权利。有什么想法吗?
可能会拒绝访问您尝试加载的所需文件
好像就是这样。我需要把文件放在哪里?也许我只是把它放在了错误的位置。以上是关于使用 phpMyAdmin 将带有部分数据的制表符分隔的 csv 文件导入 mysql 表的主要内容,如果未能解决你的问题,请参考以下文章
如何将 CSV 或制表符分隔文件映射到 MySQL 多表数据库
在 phpmyadmin 中导出带有批量数据的 mysql 表