首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以使用knex.js onConflict().merge()来添加整数列的值吗?

我可以使用knex.js onConflict().merge()来添加整数列的值吗?
EN

Stack Overflow用户
提问于 2022-01-04 15:13:13
回答 1查看 1.5K关注 0票数 0

我有一个MySQL表,如下所示:

代码语言:javascript
运行
复制
CREATE TABLE `some_table` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `some_other_id` INT(11) NOT NULL,
    `some_date` DATE NOT NULL,
    `some_total` INT(11) NOT NULL DEFAULT 0,
    `UNIQUE KEY `uq_some_key` (`some_other_id`, `period_date`)
)

我可以“插入”行值,并将其添加到some_total列中,在MySQL中这样做:

代码语言:javascript
运行
复制
INSERT INTO `some_table` (`some_other_id`, `some_date`, `some_total`)
VALUES (1, '2022-01-01', 1)
ON DUPLICATE KEY UPDATE
    `some_total` = `some_total` + VALUES(`some_total`);

如果没有命中some_other_idsome_date上的唯一约束,则该语句插入一行,如果该约束被击中,则更新该行。

是否可以使用Knex.js来做到这一点?我看到它有onConflict()merge()功能来模仿ON DUPLICATE KEY UPDATE,但我不知道它是否会推断出onConflict()的唯一约束。我也搞不懂语法。当我尝试这样做时,some_total是未定义的:

代码语言:javascript
运行
复制
knex('some_table')
    .insert({
        some_other_id: 1,
        some_date: '2022-01-01',
        some_total: 42
    })
    .onConflict()
    .merge({
        some_total: some_total + 42
    });

这是可能的吗?还是必须使用raw()查询?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-25 18:06:12

添加比直接引用列要复杂一些(可以用knex.ref()完成),因此我认为没有办法完全避免raw,但是您可以只使用raw的一个小片段,并保留查询生成器的其余部分。

代码语言:javascript
运行
复制
knex('some_table')
    .insert({
        some_other_id: 1,
        some_date: '2022-01-01',
        some_total: 42
    })
    .onConflict()
    .merge({
        some_total: knex.raw('?? + 42', 'some_total')
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70580985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档