2013-02-04 31 views
0

根據條件,我在兩個不同的表中插入一行。php mysql有條件地向不同的表插入行

讓我們說,我們有一個名爲stories與考慮2個字段的表:
story_id and comments_count

和2個其他表:

  1. regcomments (comment_id, story_id, comment_text)
  2. unregcomments (comment_id, story_id, comment_text)

現在,在inserti之前如果有任何story_id的新評論,我只想檢查comments_count是否小於100.如果是,則應該將該行插入到regcomments中,否則應將該行插入到unregcomments中。

下面是我如何做到這一點的僞代碼:

select comments_count from stories where story_id = x 
if comment_count<100 
    insert into regcomments 
else 
    insert into unregcomments 

現在,所有我關心的是,如果多個用戶同時訪問這個劇本是什麼,是否有任何機會,這會失敗?例如,一個故事有99條評論。 2個用戶在同一時間完全調用此函數。第一個選擇查詢同時執行,兩者都得到99,所以兩個插入都會被註冊,使註冊數爲101,這違反了我的商業規則。任何人都有任何想法,事情如何。或者我應該如何處理這種情況的任何想法。 (不要問我爲什麼我使用2個表:P無論如何)

回答

0

是的,它可以/將失敗,因爲10請求可能會從SQL查詢中收到99個comments_count,並且每次將新行插入到regcomments ,然後你會在表中有109行。

一種可能的解決方案是將檢查邏輯移入SQL中(使用帶有鎖定/互斥鎖的存儲過程)。

+0

謝謝Jari Karppanen,這清除了我腦海中的疑慮。 – Khan

0

對錶使用InnoDB引擎並在事務中包裝整個操作。 InnoDB將爲您處理併發問題。只需準備好代碼即可處理插入/更新語句中的錯誤。我想你必須設置一個高隔離級別,以確保選擇不會在其他操作正在進行時運行。如果這不起作用,您可能需要使用LOCK TABLE。醜陋但會做這項工作。

+0

我想使用InnoDB,但該引擎不支持全文搜索。所以我被迫使用ISAM ... – Khan

+0

mySQL 5.6在幾天前發佈。並猜測InnoDB的改進之一是什麼;-) 「添加了這些InnoDB增強功能: 您可以在InnoDB表上創建FULLTEXT索引,並使用MATCH()... AGAINST語法來查詢它們。新的鄰近搜索運算符(@)以及幾個新的配置選項和INFORMATION_SCHEMA表:有關更多信息,請參見第14.2.3.12.3節「FULLTEXT索引」。 http://dev.mysql.com/doc/refman/5.6/en/mysql-nutshell.html –

+0

聽起來不錯... :) – Khan