是否可以插入一個行,但只有當表中已有值中的一個不存在時纔可以插入一行?是否可以插入一行,但只有當值不存在時纔可以插入一行?
我創建一個告訴朋友轉診點的電子商務系統,在這裏我需要插入朋友的電子郵件到數據庫表中,但只有當它不存在於表中已經存在。這是因爲一旦新客戶註冊併購買了一些東西,我不希望任何超過1人獲得推薦積分。因此,我只需要一次在表格中填寫一封電子郵件。
我正在使用PHP 4和MySql 4.1。
是否可以插入一個行,但只有當表中已有值中的一個不存在時纔可以插入一行?是否可以插入一行,但只有當值不存在時纔可以插入一行?
我創建一個告訴朋友轉診點的電子商務系統,在這裏我需要插入朋友的電子郵件到數據庫表中,但只有當它不存在於表中已經存在。這是因爲一旦新客戶註冊併購買了一些東西,我不希望任何超過1人獲得推薦積分。因此,我只需要一次在表格中填寫一封電子郵件。
我正在使用PHP 4和MySql 4.1。
如果列是主鍵或唯一索引:
INSERT INTO table (email) VALUES (email_address) ON DUPLICATE KEY UPDATE
email=email_address
知道我的運氣有,雖然這樣做的更好的方法。 AFAIK在MySQL中沒有相當於「在DUPLICATE KEY DO NOTHING」的情況。我不確定email = email_Address位,你可以在沒有指定操作的情況下玩一下,看看它是否有效。正如有人指出,如果它有獨特的約束,它不會發生任何事情。如果您希望表中的所有電子郵件地址都是唯一的,則無需在列定義中將其指定爲唯一。
我不知道如果我得到它,但對於一個
try {
mysql_query($sql);
}
catch(Exception $e) {
}
與MySQL中的唯一字段索引結合起來呢?
如果它拋出異常,那麼你知道你有一個重複的字段。 對不起,如果沒有回答你的問題..
如果電子郵件字段是主鍵,那麼表上的約束將停止輸入重複。
最有可能是這樣的:
IF NOT EXISTS(SELECT * FROM myTable WHERE [email protected]) THEN INSERT INTO blah blah
能滾動到一個數據庫中查詢。
這工作,如果你對列的唯一索引或主鍵(EMAILADDR在這個例子中):
INSERT IGNORE INTO Table (EmailAddr) VALUES ('[email protected]')
利用這一點,如果與電子郵件的記錄已經存在(重複鍵衝突),而不是一個錯誤,該聲明失敗並且沒有插入任何內容。
有關更多信息,請參閱MySql docs。
MySQL提供REPLACE INTO http://dev.mysql.com/doc/refman/5.0/en/replace.html:
更換作品酷似INSERT, 不同之處在於,如果一個老行的表 具有相同的值作爲一個 主鍵的新行或唯一索引,在插入新行 之前,舊行被刪除 。
略有修改/添加到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
感謝您的答覆,但我不認爲它解決了我的問題。我想要一個插入行的單個查詢,或者如果失敗則什麼也不做。 – alex 2008-11-13 00:47:01
如果引發異常,則不會添加該行。你可以登錄,也可以不捕獲任何東西。 – Feet 2008-11-13 00:50:26
但是在前面的查詢中,它每次都會導致一個錯誤。我希望它在mySql中靜靜地失敗。 – alex 2008-11-13 00:55:59