我可以使用 knex.js onConflict().merge() 添加到整数列的值吗?
Can I use knex.js onConflict().merge() to add to an integer column's value?
我有一个 MySQL table 是这样的:
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`)
)
我可以“更新”行值,添加到 MySQL 中的 some_total
列:
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()
查询?
添加比直接引用列(可以用 knex.ref()
完成)更棘手一些,所以我认为没有办法完全避免原始,但是你可以只使用一个小的原始片段并保留其余的查询构建器。
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')
});
我有一个 MySQL table 是这样的:
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`)
)
我可以“更新”行值,添加到 MySQL 中的 some_total
列:
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()
查询?
添加比直接引用列(可以用 knex.ref()
完成)更棘手一些,所以我认为没有办法完全避免原始,但是你可以只使用一个小的原始片段并保留其余的查询构建器。
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')
});