MariaDB如何正确编写书籍评分Upsert条件请求 解决参数缺失报错
问题原因及解决方法
报错根因
你写的SQL语法不符合MariaDB规范,SELECT IF()的分支内不支持直接执行UPDATE/INSERT这类DML语句,错误的SQL结构导致数据库解析时识别出了超出预期的?参数占位符,因此会提示你缺少第9到12位参数。
最优解决方案
这种「存在则更新、不存在则插入」的场景,直接使用MariaDB原生支持的INSERT ... ON DUPLICATE KEY UPDATE语法即可,不需要手动写判断逻辑。
第一步:先给表加联合唯一索引
要触发重复键更新逻辑,需要先给rates表的users_id和books_id字段加联合唯一索引,执行一次以下SQL即可:
ALTER TABLE rates ADD UNIQUE KEY `idx_user_book` (`users_id`, `books_id`);
第二步:修改业务代码
修正后的代码如下:
const createBookRate = async (userId, bookId, rate) => { const sql = ` INSERT INTO rates (users_id, books_id, rate) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE rate = VALUES(rate); ` await pool.query(sql, [userId, bookId, rate]) // 更新逻辑不会返回insertId,直接用用户id和书籍id查询对应记录即可 const rateEntry = await getBookRateByUserAndBook(userId, bookId) return rateEntry }
注意事项
如果你的getBookRate方法是按主键ID查询,需要补充一个按users_id和books_id查询的方法,替换上面的getBookRateByUserAndBook调用即可。
内容的提问来源于stack exchange,提问作者mivebe
相关产品推荐
相关产品推荐

