1

我有下表:

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右侧,但不清楚如何为新行和version + 1现有行返回 0。有没有比使用select带有 a 的语句更简单的方法union

4

2 回答 2

1

你可以使用:

merge into companies (id, version, last_modified) 
values(?, coalesce((select version + 1 from companies where id = ?), 0), NOW())
于 2013-10-12T08:15:00.487 回答
0

托马斯的回答

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

如果您(就像我一样)想要有条件地插入或更新多个字段,这将变得相当麻烦 - 您需要为每个字段添加一个 coalesce((select ...), default) !

似乎更一般的答案需要是两个陈述:

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

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

我很想在这件事上被证明是错误的……

于 2018-03-19T03:12:21.587 回答