使用MySQL Workbench导入CSV失败:createdAt字段无默认值错误
解决MySQL Workbench导入CSV报错createdAt无默认值的问题
问题描述
- Mac系统下使用MySQL Workbench导入向导将CSV文件导入
region表,文件选择、列匹配等步骤操作正常,但最终显示0条记录上传 - MySQL日志每行数据报错:
- Row import failed with error: ("Field 'createdAt' doesn't have a default value", 1364) - 通过Postman调用基于Sequelize构建的JavaScript应用,能正常向数据库添加数据,
createdAt列可自动生成
原因分析
Sequelize会自动为模型添加createdAt和updatedAt字段,且通过Sequelize操作数据库时会自动填充时间值。但直接使用MySQL Workbench导入CSV时,MySQL服务器会严格检查字段约束:createdAt字段未设置默认值,也不允许为空,因此插入时缺少该字段值就会触发报错。
解决方案
方案1:修改表结构,给createdAt设置默认值
执行以下SQL语句,让MySQL自动为新插入的记录填充当前时间到createdAt字段:
ALTER TABLE region MODIFY COLUMN createdAt DATETIME DEFAULT CURRENT_TIMESTAMP;
修改完成后重新使用Workbench导入向导即可。
方案2:在Workbench导入向导中手动配置createdAt字段值
在导入向导的列匹配步骤,找到createdAt列:
- 选择「设置值」选项
- 输入
CURRENT_TIMESTAMP(或选择对应的函数选项),让每条导入记录自动填充当前时间
方案3:通过Sequelize脚本批量导入CSV
若不想修改表结构,可编写Node.js脚本借助Sequelize完成导入,Sequelize会自动处理createdAt字段:
- 先安装依赖包:
npm install csv-parser
- 编写导入脚本(示例):
const fs = require('fs'); const csv = require('csv-parser'); const { sequelize } = require('./models'); // 替换为你的Sequelize实例路径 const Region = require('./models/region')(sequelize, require('sequelize')); (async () => { await sequelize.sync(); const records = []; fs.createReadStream('./countries.csv') // 替换为你的CSV文件路径 .pipe(csv()) .on('data', (row) => { // 根据CSV实际列名调整字段映射 records.push({ country: row.name, alpha2Code: row.country, alpha3Code: row.country_code, lat: row.latitude, lng: row.longitude }); }) .on('end', async () => { await Region.bulkCreate(records); console.log('CSV数据导入完成'); process.exit(); }); })();
- 运行脚本完成导入:
node import-csv.js
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

