我想初始化H2数据库,但我不确定是否存在记录。如果它们存在,我不想做任何事情,但如果它们不存在,我想写出默认值。
这样的事情:
IF 'number of rows in ACCESSLEVELS' = 0
INSERT INTO ACCESSLEVELS VALUES
(0, 'admin'),
(1, 'SEO'),
(2, 'sales director'),
(3, 'manager'),
(4, 'REP')
;
答案 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中的行不匹配时,将其插入。有关更多详细信息,请参见“合并使用”: