2013-11-04 81 views
4

我想初始化一個H2數據庫,但我不確定記錄是否存在。如果它們存在,我不想做任何事情,但如果它們不存在,我想寫出默認值。H2 SQL數據庫 - INSERT如果記錄不存在

事情是這樣的:

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

回答

3

以下作品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); 
+0

您可以稍微解釋一下這種語法嗎?難以破譯 – IcedDante

+0

這是一個「insert into ... select」語句,通常用於將查詢中的多行插入到表中。現在,我沒有使用簡單的「select * from tableName」,而是使用了具有硬編碼值的「聯合」查詢。然後,「不存在的地方」確保只有當表「accesslevels」爲空時插入這些行。 –

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

更新現有行,並插入不存在的行。如果未指定鍵列,則使用主鍵列來查找該行。

+1

我知道這個功能,但我不希望如果存在更新的記錄。 – szedjani

+0

嘗試編寫用戶函數,在其中使用「從...中選擇計數(ID)到...」,然後比較結果... – MartinB