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

PostgreSQL中Knex无法更新commission_earned列问题求助

commission_earned列编辑时无法更新的排查与解决

先从最容易定位问题的点入手:

1. 捕获更新错误,查看数据库真实报错

你的编辑接口没有捕获Knex操作的异常,哪怕数据库返回错误,代码也会直接跳转,导致你看不到问题根源。先修改代码加上错误捕获:

app.post("/editScore", async (req,res) => {
    var score_id = req.body.scoreID;
    try {
        const myData = await calculateCommission.getData(req.body);
        console.log('待更新数据:', myData); // 再次确认commission_earned字段存在且值正确
        const affectedRows = await knex('commissions').update(myData).where('id',score_id);
        console.log('更新影响行数:', affectedRows); // 如果是0,说明没找到对应id的行
        res.redirect("/commissionLog");
    } catch (err) {
        console.error('更新失败详情:', err);
        res.status(500).send(`更新失败: ${err.message}`);
    }
});

运行后查看控制台的错误信息,PostgreSQL会直接告诉你拒绝更新该列的具体原因。

2. 检查commission_earned是否为生成列(Generated Column)

如果该列被设置为数据库自动计算的生成列,手动执行UPDATE会被数据库拒绝。执行以下SQL查询表结构:

SELECT column_name, is_generated, generation_expression 
FROM information_schema.columns 
WHERE table_name = 'commissions' AND column_name = 'commission_earned';

如果is_generated值为ALWAYS,说明这是生成列:

  • 要么删除生成列属性,允许手动更新;
  • 要么修改你之前创建的触发器,把触发时机改成BEFORE INSERT OR UPDATE,让数据库在编辑时也自动计算该列值,此时代码里不需要传入commission_earned。

3. 验证数据库列的更新权限

虽然之前运行正常,但权限可能被意外修改。执行SQL检查当前用户对该列的更新权限:

SELECT has_column_privilege(current_user, 'commissions', 'commission_earned', 'UPDATE');

如果返回f,需要重新赋予权限:

GRANT UPDATE(commission_earned) ON commissions TO your_username;

4. 确认更新操作确实命中目标行

从控制台的更新影响行数判断,如果是0,说明score_id对应的记录不存在,或者id字段类型不匹配(比如score_id是字符串,数据库id是整数)。可以手动用SQL测试:

UPDATE commissions SET commission_earned = 测试值 WHERE id = 你的score_id;

观察是否能成功更新,同时检查行数变化。

5. 排查触发器/约束冲突

如果你之前创建的触发器只在INSERT时触发,不会导致手动更新失败,但要检查是否有其他触发器、CHECK约束阻止了commission_earned的更新——比如约束限制该列只能是某个范围的值,而你的计算值超出了范围。

内容的提问来源于stack exchange,提问作者get_post_malone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:15:34