H2 MERGE:未找到列

时间:2013-10-11 20:04:25

标签: h2 sql-merge

我有下表:

create table companies (id identity, version int not null, last_modified timestamp not null);
insert into companies (version, last_modified) values (0, NOW());

然后我创建一个PreparedStatement并为索引1提供一个值:

merge into companies (id, version, last_modified) values(?, version + 1, NOW())

H2因此错误而失败:

Column "VERSION" not found

我知道H2不喜欢右侧的version + 1,但不清楚如何为新行返回0,为现有行返回version + 1。有没有比使用select的{​​{1}}语句更简单的方法?

2 个答案:

答案 0 :(得分:1)

您可以使用:

merge into companies (id, version, last_modified) 
values(?, coalesce((select version + 1 from companies where id = ?), 0), NOW())

答案 1 :(得分:0)

托马斯的回答

merge into companies (id, version, last_modified) 
values(?, coalesce((select version + 1 from companies where id = ?), 0), NOW())
如果你(像我一样)想要有条件地插入或更新几个字段,那么变得相当麻烦 - 你需要为每个字段合并((选择...),默认)!

看起来更通用的答案需要是两个陈述:

MERGE INTO companies (id) key (id) VALUES (?)
UPDATE companies SET version=1+IFNULL(version,0), otherfields... WHERE id=?

换句话说:不要将MERGE用于记录中的多个条件更改(您需要表达式而不仅仅是值)。

我很想在这方面被证明是错误的......