2008-11-13 66 views
17

是否可以插入一個行,但只有當表中已有值中的一個不存在時纔可以插入一行?是否可以插入一行,但只有當值不存在時纔可以插入一行?

我創建一個告訴朋友轉診點的電子商務系統,在這裏我需要插入朋友的電子郵件到數據庫表中,但只有當它不存在於表中已經存在。這是因爲一旦新客戶註冊併購買了一些東西,我不希望任何超過1人獲得推薦積分。因此,我只需要一次在表格中填寫一封電子郵件。

我正在使用PHP 4和MySql 4.1。

回答

21

如果列是主鍵或唯一索引:

INSERT INTO table (email) VALUES (email_address) ON DUPLICATE KEY UPDATE 
email=email_address 

知道我的運氣有,雖然這樣做的更好的方法。 AFAIK在MySQL中沒有相當於「在DUPLICATE KEY DO NOTHING」的情況。我不確定email = email_Address位,你可以在沒有指定操作的情況下玩一下,看看它是否有效。正如有人指出,如果它有獨特的約束,它不會發生任何事情。如果您希望表中的所有電子郵件地址都是唯一的,則無需在列定義中將其指定爲唯一。

1

我不知道如果我得到它,但對於一個

try { 
    mysql_query($sql); 
} 
catch(Exception $e) { 

} 

與MySQL中的唯一字段索引結合起來呢?

如果它拋出異常,那麼你知道你有一個重複的字段。 對不起,如果沒有回答你的問題..

+0

感謝您的答覆,但我不認爲它解決了我的問題。我想要一個插入行的單個查詢,或者如果失敗則什麼也不做。 – alex 2008-11-13 00:47:01

+0

如果引發異常,則不會添加該行。你可以登錄,也可以不捕獲任何東西。 – Feet 2008-11-13 00:50:26

+0

但是在前面的查詢中,它每次都會導致一個錯誤。我希望它在mySql中靜靜地失敗。 – alex 2008-11-13 00:55:59

0

如果電子郵件字段是主鍵,那麼表上的約束將停止輸入重複。

6

最有可能是這樣的:

IF NOT EXISTS(SELECT * FROM myTable WHERE [email protected]) THEN INSERT INTO blah blah 

能滾動到一個數據庫中查詢。

32

這工作,如果你對列的唯一索引或主鍵(EMAILADDR在這個例子中):

INSERT IGNORE INTO Table (EmailAddr) VALUES ('[email protected]') 

利用這一點,如果與電子郵件的記錄已經存在(重複鍵衝突),而不是一個錯誤,該聲明失敗並且沒有插入任何內容。

有關更多信息,請參閱MySql docs

3

略有修改/添加到naeblis的回答是:

INSERT INTO table (email) VALUES (email_address) 
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) 

這種方式,你不必扔email=email_address在那裏你得到LAST_INSERT_ID()如果語句更新正確的值。

來源: MySQL的文檔:12.2.5.3

相關問題