2015-06-14 76 views
0

當且僅當5行中沒有一行已經存在時,我想在表中插入5個新行。如果其中一個在表中,那麼我想中止插入(不更新任何內容),並知道哪一個(或哪些)已經存在。如果重複則中止插入

我能想到的長期的方法來做到這一點(比如找如果SELECT col1 WHERE col1 IN (value1,value2,...)回報什麼,然後再插入,只有當它沒有)

我也想交易可以做到這一點,但我目前正在學習他們如何工作。但是,我不知道一個交易是否可以給我哪個條目是重複的。

有或沒​​有交易,有沒有辦法在一個或兩個查詢中做到這一點?

感謝

回答

1

我懷疑有比你所提到的解決方案更好的方法:首先運行一個查詢SELECT,如果它不返回任何東西,INSERT。您在一個或兩個查詢中要求提供某些內容。這恰好是兩個查詢,在我看來非常有效。我想不出一種有效的方式來爲此使用事務。當您有多個INSERTUPDATE查詢時,事務很好,您只有一個。

0

插入說明沒有給很多機會做這項工作。如果你在期望的領域打開一個唯一的約束,不是插入的所有字段中唯一一個指令,以

INSERT INTO FOO(col1) VALUES 
    (val1), 
    (val2), 
    (val3), 
    (val4), 
    (val5); 

這是要給予應有的約束違反異常,因此中止指令。 如果你想避免工作變得有點變態例外:

INSERT INTO FOO(col1) VALUES 
    Seleect a.* from (Select val1 
     union 
    Select val2 
     union 
    select val3 
     union 
    select val4 
     union 
    select val5) a 
    inner join 
    (select g.* from( 
     select false b from foo where col1 in(val1,val2....) 
     union 
     select true) g 
    limit 1) b on b.b 

發生什麼事?只有在沒有值的情況下,最內部的查詢纔會返回true,因此只有在沒有值時纔會插入所有值。

+1

OP想知道哪一個(或哪些)已經存在,如果有的話。 –