You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:09:01