我有这个问题;
knex('metrics').insert(function() {
this.select('metric as name')
.from('stage.metrics as s')
.whereNotExists(function() {
this.select('*')
.from('metrics')
.where('metrics.name', knex.raw('s.metric'))
})
})
表metrics
有两列;一个正在递增的id和名字。我希望这会插入到name列中,因为子查询有一列,标记为name,默认id。然而,它抱怨我提供了一个类型字符列,我的整数列id不同。如何明确表示我希望id采用默认值?
答案 0 :(得分:2)
这可以解决问题
knex('metrics').insert(function() {
this
.select([
knex.raw('null::bigint as id'), // or any other type you need (to force using default value you need to pass explicitly null value to insert query)
'metric as name'
])
.from('stage.metrics as s')
.whereNotExists(function() {
this.select('*')
.from('metrics')
.where('metrics.name', knex.raw('s.metric'))
})
})
我知道,看起来有点 hacky 。很高兴在knex API中看到类似的内容(下面的示例是提案,而非工作示例)
knex('table_name')
.insert(
['name', 'surname'],
function () {
this.select(['name', 'surname']).from('other_table'))
}
)
哪个产生
insert into table_name (name, surname) select name, surname from other_table;
我不确定这个界面,但你明白了。就像显式写入要插入的字段一样。