H2 SQL数据库 - 如果记录不存在则INSERT

时间:2013-11-04 12:49:28

标签: sql h2

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

这样的事情:

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

4 个答案:

答案 0 :(得分:6)

以下适用于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);

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

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

this拉取请求:

  

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

来自官方site

  

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

答案 3 :(得分: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