【发布时间】:2021-04-18 17:55:39
【问题描述】:
我正在尝试进行以下交易:
static async save(habit){
await db.beginTransaction;
try {
await db.execute('SELECT @habitId:=MAX(habits.habitId)+1 FROM habits');
await db.execute('INSERT INTO habits(habits.habitId, habits.name, habits.repeatVal, habits.notification, habits.color, habits.question, habits.id) VALUES (@habitId, ?, ?, ?, ?, ?, ?)',
[habit.name, habit.repeatVal, habit.notification, habit.color, habit.question, habit.id]);
await db.execute('INSERT INTO habit_status(habit_status.habitId, habit_status.date, habit_status.status) VALUES (@habitId, "2021-04-01", 0), (@habitId, "2021-04-02", 0), (@habitId, "2021-04-03", 0), (@habitId, "2021-04-04", 0), (@habitId, "2021-04-05", 0), (@habitId, "2021-04-06", 0), (@habitId, "2021-04-07", 0), (@habitId, "2021-04-08", 0)');
await db.commit();
} catch (err) {
console.error(`Error occurred while creating habit: ${err.message}`, err);
db.rollback(function(){});
console.info('Rollback successful');
return 'error creating habit';
}
}
不幸的是,我收到以下错误:
创建习惯时出错:无法添加或更新子行:外键约束失败(
intend.habit_status, CONSTRAINThabitFOREIGN KEY (habitId) REFERENCEShabits(habitId) ON DELETE CASCADE) 错误:无法添加或更新子行:外键约束失败 (intend.habit_status, CONSTRAINThabitFOREIGN KEY (habitId) REFERENCEShabits(habitId) ON删除级联)
还有:
TypeError: db.rollback is not a function
我认为这是因为@habitId 可能没有将 habitId 传递给我的第三个执行函数。但为什么?以及如何解决这个问题?
【问题讨论】:
-
只要您在事务中并且没有提交插入,@habit 不在数据库中,因此您无法在事务中进行此操作
-
但是如果我使用事务在 phpmyadmin 中做同样的事情,例如它可以工作。
-
这仅在事务在同一执行时才有效,您必须检查是否可以执行多个查询
标签: javascript mysql sql node.js foreign-keys