Sequelize关联MySQL时外键为Null的问题求助
解决方案
核心问题原因
你插入Sales数据时,没有将刚创建的File记录的ID关联到Sales的外键字段FileID上,导致数据库中该字段始终为Null;直接添加NOT NULL约束失败,是因为已有Null值的记录存在。
步骤1:关联File ID到Sales数据
修改数据插入代码,先获取创建的File实例ID,再给每条Sales数据添加上该ID:
try { // 保存创建的File实例,获取其ID const createdFile = await File.create(req.file); } catch (err) { console.log(err); res .status(500) .json({ message: "Server Error File NOt Uploaded To Database" }); return; } try { // 给每条Sales数据添加FileID字段,值为刚创建的File的ID const salesDataWithForeignKey = data.map(item => ({ ...item, FileID: createdFile.id })); await Sales.bulkCreate(salesDataWithForeignKey); } catch (error) { console.log(error); res .status(500) .json({ message: "Internal Server Error Data canot be uploaded" }); return; }
步骤2:添加NOT NULL约束(可选)
如果需要确保FileID不为Null,有两种方式:
方式一:在关联定义时设置
修改关联代码,给外键添加allowNull: false约束,这样sync时会自动生成NOT NULL的数据库约束:
await File.hasMany(Sales); // 给belongsTo关联的外键设置不允许Null await Sales.belongsTo(File, { foreignKey: { allowNull: false } }); await sequelize .sync({ force: true }) .then(async () => { console.log("Database & tables created!"); }) .catch((err) => { console.log("Error: " + err); });
方式二:手动修改现有表(如果不想重新建表)
如果已经有数据,先更新所有Sales记录的FileID为有效的File ID,再执行SQL添加约束:
-- 先更新现有Null值的记录,替换为实际存在的File ID UPDATE sales SET FileID = 1 WHERE FileID IS NULL; -- 添加NOT NULL约束 ALTER TABLE sales MODIFY COLUMN FileID INT NOT NULL;
注意事项
- 确保
req.file包含File模型所需的所有字段(originalname、destination、filename、path),否则File.create会失败。 - 如果你的File模型的主键不是默认的
id,需要在关联时指定sourceKey和targetKey。
内容的提问来源于stack exchange,提问作者Zia-ur-Rehman Rehmani
相关产品推荐
相关产品推荐

