我有下表:
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}}语句更简单的方法?
答案 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用于记录中的多个条件更改(您需要表达式而不仅仅是值)。
我很想在这方面被证明是错误的......