我有一个MySQL表,如下所示:
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中这样做:
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_id
和some_date
上的唯一约束,则该语句插入一行,如果该约束被击中,则更新该行。
是否可以使用Knex.js来做到这一点?我看到它有onConflict()
和merge()
功能来模仿ON DUPLICATE KEY UPDATE
,但我不知道它是否会推断出onConflict()
的唯一约束。我也搞不懂语法。当我尝试这样做时,some_total
是未定义的:
knex('some_table')
.insert({
some_other_id: 1,
some_date: '2022-01-01',
some_total: 42
})
.onConflict()
.merge({
some_total: some_total + 42
});
这是可能的吗?还是必须使用raw()
查询?
发布于 2022-01-25 18:06:12
添加比直接引用列要复杂一些(可以用knex.ref()
完成),因此我认为没有办法完全避免raw,但是您可以只使用raw的一个小片段,并保留查询生成器的其余部分。
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')
});
https://stackoverflow.com/questions/70580985
复制相似问题