phpmyadmin 导入不支持按主键更新,因其csv导入仅执行insert语句,未提供on duplicate key update机制;需手动构造sql或用php/python脚本结合预处理语句实现更新。
phpmyadmin 本身不支持「按主键更新」,只能插入或跳过冲突;真要更新已有记录,得绕开界面,用 sql 或程序层实现。
为什么 phpMyAdmin 导入按钮做不到 UPDATE?
它的 CSV 导入功能底层调用的是 INSERT 语句,不是 REPLACE INTO 或 INSERT ... ON DUPLICATE KEY UPDATE。即使你勾选了「第一行包含列名」,它也只负责字段映射,不改变语义——遇到重复主键或唯一键,默认报错 ERROR 1062,不会自动覆盖。
- 导入界面上没有「冲突时更新」的开关选项
- 它不解析业务逻辑(比如哪列是主键、哪些字段需要更新),只做字节到字段的机械映射
- 即使表有
ON UPDATE CURRENT_TIMESTAMP,也仅对真正执行的UPDATE生效,而导入过程不触发
替代方案:用 INSERT ... ON DUPLICATE KEY UPDATE 手动构造 SQL
如果你能导出 CSV 内容、再转成 SQL,就能控制行为。关键前提是目标表必须有 PRIMARY KEY 或 UNIQUE 约束(如 AflossingID),否则无法判断“哪条是已有的”。
- 用 Python/PHP 脚本读 CSV,逐行生成形如
INSERT INTO aflossingen (AflossingID, Aflossingdatum, Aflossingsbedrag) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE Aflossingdatum = VALUES(Aflossingdatum), Aflossingsbedrag = VALUES(Aflossingsbedrag)的语句 - 注意:
VALUES(col)表示本次 INSERT 中该字段的值,不是字面量VALUES函数 - 避免在
ON DUPLICATE KEY UPDATE中写SET col = ?——参数绑定会失效,必须用VALUES(col)或显式值 - 导入前确认
AflossingID确实是主键或唯一索引,否则语句执行但不触发更新分支
更稳妥的做法:用 PHP + mysqli 预处理批量执行
比拼 SQL 字符串安全,也比 phpMyAdmin 导入更可控。核心是复用一个预处理语句,绑定不同行数据多次执行。
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
- 准备语句用
$stmt = $mysqli->prepare("INSERT INTO aflossingen (...) VALUES (...) ON DUPLICATE KEY UPDATE ...") - CSV 每行调用一次
$stmt->bind_param(),然后$stmt->execute() - 比单条
INSERT快,且避免 SQL 注入——因为值不拼进 SQL 字符串 - 错误处理要检查
$stmt->errno,而非依赖 phpMyAdmin 的模糊提示 - 注意:MySQLi 默认不开启
MYSQLI_REPORT_STRICT,建议先设mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT),让异常直接抛出
容易被忽略的坑:字符集与空值处理
就算 SQL 写对了,数据不对照样更新失败或静默丢字段。
- CSV 文件必须是 UTF-8 无 BOM,否则中文字段可能变成
???或导致整行解析失败 - 空字符串
""和\N含义不同:\N对应 SQL 的NULL,而空字符串是字符串类型值;导入前统一用\N表示空,并在 SQL 中明确写col = VALUES(col),否则""可能覆盖掉原本的NULL - 日期字段如
Aflossingdatum必须是YYYY-MM-DD格式,2024/01/01或01-01-2024会被 MySQL 当作非法值置为0000-00-00 - 数值字段里不能有逗号、货币符号或引号,例如
"1,234.56"会报错,得提前清洗成1234.56
真正麻烦的从来不是写那条 ON DUPLICATE KEY UPDATE,而是确保 CSV 每一行的每个字段,在类型、格式、编码上都和目标表严丝合缝——少一个引号、多一个 BOM、日期少两位,都可能导致部分行更新失败却不报错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










