2013-08-27 56 views
0

我有一個名爲category表和表看起來像如何不在sqlite中的列中插入公共數據?

cat_id cat_name 
1   Science 
2   Arts 

,並命名爲item另一個表看起來像

item_id item_name cat_id 
1   physics 1 
2   literature 2 
3   chemistry 1 

請註明該cat_id在這裏item表的外鍵。

現在我想,如果我把mathitem_nameArts類別,然後它會插入成功,但我希望這以這樣的方式,如果我想再次提出相同的數據,那麼它不會插入發生。請也標誌着我有cat_name和ITEM_NAME才把我的查詢獲取使用cat_name從類別表,並插入到項目表像這樣的CATEGORY_ID

insert into item (item_name,cat_id) select 'math',category.cat_id from category where category.cat_name = 'Arts' 

但如果我再次運行此查詢它插入同一項目math再次,但我想阻止這種情況發生,我該怎麼辦?

+0

您可以在插入數據庫之前檢查數據庫,或者將'item_name'列設置爲MySQL中唯一,它會引發錯誤。 – castis

+0

這是MySQL還是SQLite? –

+0

SQLITE數據庫是可取的 – Reyjohn

回答

1

Reyjohn,你不能將列定義爲唯一嗎?這將防止重複值。

我不使用sqlite,但我的印象是它使用類似MySQL的語法,但沒有一些更嚴格的檢查。

按照這樣的回答: sqlite - How to get INSERT OR IGNORE to work

你可以使用INSERT OR IGNORE聲明。

+0

謝謝.. :)它的工作 – Reyjohn

+0

很高興我可以幫助! –

0

SQLite沒有「插入或更新」,這將是你的情況下完美。

但是,您可以使用SQLite支持的「INSERT OR REPLACE」和「UNION」一起模擬它。我開發了這種技術,因爲我想發佈一個單一的查詢,並讓SQLite引擎完成所有工作。

INSERT OR REPLACE INTO item (item_id, item_name, cat_id) 
    SELECT item_id, item_name, cat_id FROM (

     SELECT item_id, item_name, 'new_category' FROM item 
     WHERE item_name='math' 

     UNION 

     SELECT NULL, 'math', 'new_category' 

    ) ORDER BY item_id DESC LIMIT 1; 

所以你基本上是做一個「選取ITEM_NAME =‘數學’」來獲得現有的記錄(如果存在的話),然後您連接這個結果(UNION)與生成一個新的記錄中的SELECT一個NULL item_id。

最後的技巧是「ORDER BY item_id DESC LIMIT 1」,其中INSERT語句的實際結果恰好爲1個記錄:存在的記錄,具有相同的item_id和'new_category'或新的一個帶有NULL item_id,它強制SQLite爲你創建一個item_id。

您還可以檢查記錄是否存在之前(使用SELECT)並決定是否需要INSERT或UPDATE。但是這會在客戶端導致2個查詢和額外的代碼。這就是爲什麼我開發了上述技巧。

相關問題