我想初始化一个 H2 数据库,但我不确定记录是否存在。如果它们存在我不想做任何事情,但如果它们不存在我想写默认值。
像这样的东西:
IF 'number of rows in ACCESSLEVELS' = 0
INSERT INTO ACCESSLEVELS VALUES
(0, 'admin'),
(1, 'SEO'),
(2, 'sales director'),
(3, 'manager'),
(4, 'REP')
;
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”)。
以下适用于 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);
为此,您可以在 H2 数据库中使用MySQL 兼容模式。从1.4.197
版本开始,它支持以下语法:
INSERT IGNORE INTO table_name VALUES ...
从这个拉取请求:
INSERT IGNORE
在常规模式下不支持,您必须通过附加;MODE=MySQL
到数据库 URL 或执行SET MODE MySQL
语句来显式启用 MySQL 兼容模式。
来自官方网站:
INSERT IGNORE
ON DUPLICATE KEY UPDATE
部分支持,如果未指定,可用于跳过具有重复键的行。
这是另一种方式:
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 中的一行不匹配时,插入它。有关详细信息,请参阅“合并使用”: