2011-06-27 91 views
3

我想將數據插入到我的MySQL表中唯一的一個。也就是說,如果表中已經存在完全相同的條目(所有列都包含相同的值),則應該取消插入操作。這很容易通過定義唯一鍵和處理即將發生的錯誤來完成,但我無法改變表結構。唯一地插入到沒有唯一鍵的MySQL表中

我敢肯定,即使在沒有唯一鍵的表格中,也可以很容易地捕捉到這一點。當然,我可以事先使用SELECT聲明手動檢查這種記錄的存在,但可能會有同時修改我的表的同時發生的情況(在檢查SELECT與實際INSERT之間)。

我想在一個SQL命令中執行檢查和INSERT操作。任何人都可以將我指向正確的方向嗎?

+0

你在桌子上用鑰匙嗎?您可以使用'按重複鍵插入'。 http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html – Tim

+0

@Tim這需要唯一的密鑰,@BjörnMarschollek說他不能添加這樣的密鑰。 –

+0

爲什麼不能改變桌子,這是做這件事的最好方法。任何其他方式都是黑客行爲,如果在鎖定完成後發生查詢運行期間發生不良情況,並且不釋放鎖定,則其他任何方法都無法將其插入。 – mikeq

回答

4

讓我們假設你有5列的表 - col1,col2,col3,col4,col5。假設你試圖插入的這些列對應的數據在變量中 - $ col1,$ col2,$ col3,$ col4,$ col5(我假設PHP是你的語言,但是請按照你的名字)。

所以你插入可能看起來像:

INSERT INTO `tableA` (`col1`, `col2`, `col3`, `col4`, `col5`) 
SELECT $col1, $col2, $col3, $col4, $col5 
FROM `tableA` 
WHERE NOT EXISTS (SELECT 1 
    FROM `tableA` 
    WHERE `col1` = $col1 
    AND `col2` = $col2 
    AND `col3` = $col3 
    AND `col4` = $col4 
    AND `col5` = $col5); 

另一種方法是:

INSERT INTO `tableA` (`col1`, `col2`, `col3`, `col4`, `col5`) 
SELECT $col1, $col2, $col3, $col4, $col5 
FROM `tableA` 
WHERE `col1` = $col1 
AND `col2` = $col2 
AND `col3` = $col3 
AND `col4` = $col4 
AND `col5` = $col5 
HAVING COUNT(1) = 0; 

希望這有助於。

0

您可以對查詢使用表鎖,直到查詢完成處理,其他進程將不會修改它。

檢查此鏈接: http://www.mssqlcity.com/Articles/Adm/SQL70Locks.htm

,然後照你說的使用 「這樣的記錄SELECT語句提前,但也有可能是修改在此期間我的表(與檢查之間併發實例SELECT和實際的INSERT)。「

+2

這篇文章是關於MSSQL的,Q.是針對MySQL –

+0

請注意,你必須嚴格測試,以確保表格不會永遠被鎖定,或者你的'SELECT' +'INSERT '不會阻止桌子好幾個小時。 –

0

沒有唯一的密鑰,以確保唯一行的唯一方法是不允許在桌子上的任何寫併發(要麼鎖定他們或使用serialisable隔離級別)