14

我想初始化一个 H2 数据库,但我不确定记录是否存在。如果它们存在我不想做任何事情,但如果它们不存在我想写默认值。

像这样的东西:

IF 'number of rows in ACCESSLEVELS' = 0
INSERT INTO ACCESSLEVELS VALUES
    (0, 'admin'),
    (1, 'SEO'),
    (2, 'sales director'),
    (3, 'manager'),
    (4, 'REP')
    ;
4

4 回答 4

20
MERGE INTO ACCESSLEVELS 
  KEY(ID) 
VALUES (0, 'admin'),
  (1, 'SEO'),
  (2, 'sales director'),
  (3, 'manager'),
  (4, 'REP');

更新现有行,并插入不存在的行。如果未指定键列,则使用主键列来查找行。

如果您不命名列,则必须按照表中的定义提供它们的值。如果您希望将列命名为更独立于它们在表定义中的顺序,或者避免在不必要或不可能的情况下为所有列提供值:

MERGE INTO ACCESSLEVELS 
  (ID, LEVELNAME)
  KEY(ID) 
VALUES (0, 'admin'),
  (1, 'SEO'),
  (2, 'sales director'),
  (3, 'manager'),
  (4, 'REP');

请注意,您必须在列列表和 KEY 子句中包含键列(本例中为“ID”)。

于 2013-11-04T13:04:54.790 回答
12

以下适用于 MySQL、PostgreSQL 和 H2 数据库:

drop table ACCESSLEVELS;

create table ACCESSLEVELS(id int, name varchar(255));

insert into ACCESSLEVELS select * from (
select 0, 'admin' union
select 1, 'SEO' union
select 2, 'sales director' union
select 3, 'manager' union
select 4, 'REP'
) x where not exists(select * from ACCESSLEVELS);
于 2013-11-04T14:02:18.407 回答
1

为此,您可以在 H2 数据库中使用MySQL 兼容模式。1.4.197版本开始,它支持以下语法: INSERT IGNORE INTO table_name VALUES ...

这个拉取请求:

INSERT IGNORE在常规模式下不支持,您必须通过附加;MODE=MySQL到数据库 URL 或执行SET MODE MySQL语句来显式启用 MySQL 兼容模式。

来自官方网站

INSERT IGNOREON DUPLICATE KEY UPDATE部分支持,如果未指定,可用于跳过具有重复键的行。

于 2019-01-09T18:09:56.890 回答
0

这是另一种方式:

CREATE TABLE target (C1 VARCHAR(255), C2 VARCHAR(255));

MERGE INTO target AS T USING (SELECT 'foo' C1, 'bar') AS S ON T.C1=S.C1
WHEN NOT MATCHED THEN
    INSERT VALUES('foo', 'bar')

当 S 中的一行与 T 中的一行或多行匹配时,什么也不做。但是当 S 中的一行不匹配时,插入它。有关详细信息,请参阅“合并使用”:

https://www.h2database.com/html/commands.html#merge_using

于 2020-03-30T07:03:07.370 回答