0

我在 H2 db 中有我的表模式,如下所示:

如果不存在则创建表测试( id bigint not null,name varchar(255), primary key (id) );

如果不存在,则更改表测试添加约束 Test_NAME UNIQUE (name);

我想通过从表中选择最新的 id 值并将其递增 1 来插入名称属性的值作为“默认”如果它在表中不存在。

示例: 如果 name = Default 的条目已经存在,则不要插入。

身份证 | 姓名

1 | 默认

如果 name = Default 的条目不存在,则插入。

身份证 | 姓名

1 | 美国广播公司

2 | XYZ

对于 id 列,找到最大 id 并将其加一。在这种情况下,插入 id=3 和 name=Default。

我的查询如下:

INSERT INTO Test (id , name) SELECT max(id) + 1, 'Default' from Test WHERE NOT EXISTS (SELECT * FROM Test where name='Default');

但是,它给了我一个错误说: NULL not allowed for column "ID"; SQL 语句,因为它在内部 select 语句上应用 where 条件。

我也试过: MERGE INTO Test KEY(name) VALUES (SELECT MAX(id) + 1 from Test, 'Default');

它给出了一个错误,因为合并尝试使用新值进行更新。如果它找到“默认”,它将使用新的 id 更新导致主键违规的行。

有一个更好的方法吗?我怎样才能使查询工作?

4

3 回答 3

3

你把这大大地复杂化了。id将该字段定义为自动增量,并在该字段上放置一个唯一索引name。唯一索引可防止插入重复名称,而如果插入成功,则自动递增会将 id 字段的值增加 1(默认情况下)。

于 2017-09-30T23:11:35.670 回答
0

当您第一次运行查询时,在表中找不到记录,因此,它会在那里给出错误“null”,所以如果您在其中添加 IFNULL() 函数,如下所示

INSERT INTO Test (id , name) 
SELECT **IFNULL**(max(id),0) + 1, 'Default' 
FROM Test 
WHERE NOT EXISTS (SELECT * FROM Test where name='Default');
于 2019-08-17T08:44:41.960 回答
0

我将 id 更新为自动递增,以下查询完美运行

INSERT INTO Test (name) select * from (select 'Default') as tmp WHERE NOT EXISTS (SELECT name from Test where name='Default');

于 2017-10-02T05:27:36.750 回答