2010-10-22 43 views
2

我對此很新,所以很抱歉我缺乏知識。Perl MySQL - 如果特定字段匹配,如何跳過更新或插入行?

我建立了一些我已經成功寫入並通過使用CGI和DBI模塊的Perl腳本訪問的表,這要感謝這裏的建議。

這是本地樂隊簡報的成員名單。是的,我知道,大量的應用程序在那裏,但我希望瞭解這一點。

1-我想避免更新或插入一行,如果我的輸入的一部分匹配列數據在一個特定的列/字段。

創建表時,在phpmyadmin中,我在結構視圖中單擊該列名稱上的「U」(唯一)。 這似乎工作,沒有愚蠢的插入,但我希望一個硬編碼的Perl解決方案,所以我理解這個機制。

我讀到了「插入忽略」/「更新忽略」並全面搜索,但是,我發現的所有內容似乎不僅僅是跳過一個重複。

該列不是一個鍵或autoinc只是一個普通的舊字段與電子郵件地址。 (錯誤?)

2-當我寫入數據庫時​​,如果傳入的電子郵件地址與該字段中的某個匹配,我不想做任何事情。

我希望最快的方法,這樣我就可以循環訪問他們現有的列表導出數據(他們無法弄清楚軟件),沒有賽車/鎖定問題或任何我明顯無知的情況。

由於我從頭開始創建,所以1和2實際上可能部分沒有意義。如果是這樣,那麼最好的方法是什麼?

我仍然想要一個自動遞增的ID,所以我可以通過ID號碼進行訪問,或者通過某種count ++ foreach循環訪問。

我的石頭刀的方法可能對這裏的大師可笑,但是,我需要從某處開始。

在此先感謝您的幫助。

回答

1

由於電子郵件地址欄聲明爲UNIQUE,INSERT IGNORE正是您想要插入的內容。聽起來你已經知道如何做正確的事情! (你可以在perl中執行「不要插入,如果它已經存在」的功能,但是很難得到正確的結果,因爲你必須在事務中包裝測試和更新。關係型數據庫是它將執行約束檢查這樣對你,以確保即使你的應用程序是越野車的數據完整性。)

對於更新,我不知道什麼是「更新忽略」會是什麼樣子。 WHERE子句中的什麼限制了UPDATE隻影響1個所需的行?也許你提到的那個auto_increment主鍵?如果你想要寫,例如,

UPDATE members SET firstname='Sue' WHERE member_id = 5; 

那麼我認爲這個「更新忽略」你想要的功能可能只是像

UPDATE members SET firstname='Sue' WHERE member_id = 5 
    AND email != '[email protected]'; 

這是做一個奇怪的事情,但是這我最好猜測你的意思:)

+0

謝謝!我接受了你的答案。 – DulcimerDude 2010-10-22 19:28:36

1

只是做插件,如果數據將使唯一的列不唯一,你會得到一個SQL錯誤,你應該能夠捕獲這一點,並採取一切適當的(例如,忽略它,記錄它,警報用戶。 ..)