[英]Unique record mysql on inserts
我想實施一個新的推薦/促銷系統。 我的新系統,當用戶注冊一個特定的來源時,他就會得到他的幫助。 來源可以是來自referal(客戶域)和促銷代碼(例如:50%折扣)的任何內容。 此來源還有一個日期(ymd)。 每個源ID都是唯一的,多個用戶可以擁有相同的源ID
例如:
source id : 1 = www.domain1.com / 2011-11-20 / (empty referal code)
source id : 2 = www.domain1.com / 2011-11-20 / referalcode1
source id : 3 = www.domain2.com / 2011-11-20 / referalcode1
source id : 4 = www.domain2.com / 2011-11-20 / referalcode2
可以將referal代碼從client1混合到客戶端2
我如何確定當有人注冊(它的免費注冊,我們現在每小時超過1000)我們沒有重復記錄並冒險mysql產生錯誤?
從mysql頁面:
主要思想是使用
ignore
語句插入記錄。 如果使用IGNORE關鍵字,則執行INSERT語句時發生的錯誤將被視為警告。 例如,如果沒有IGNORE,則復制表中現有UNIQUE索引或PRIMARY KEY值的行會導致重復鍵錯誤,並且語句將中止。 使用IGNORE時,仍未插入行,但未發出錯誤。 然后使用mysql_insert_id
檢索最后一個ID
如果記錄不存在,它將插入它並返回最后一個ID。
現在,如果沒有返回記錄,您可以進行選擇。 這意味着記錄已經存在,所以只需使用它即可。
例:
// make sure $id is safe (preventing sql injections)
$sql = "INSERT IGNORE INTO yourtable SET `field1` = 'value1' ... ";
mysql_query($sql);
if(mysql_affected_rows() == 1) { // no record found and then the inserts worked
$id = mysql_insert_id(); // id from the primary key
// add to cache
}
else {
// you can also cache them when they were inserted (faster to run than a select statement)
$id = retreiveFromCache($field1, $field2 /* etc...*/);
if(!$id) { // no record found in cache
// now the select can be done using the fields received
// make sure your use the right index otherwise it can be slow
$sql = "SELECT id FROM promotions_referrals WHERE `field1` = 'value1' ... "; //
$query = mysql_query($sql);
$row = mysql_fetch_assoc($query);
$id = $row['id'];
// add to cache
}
}
此時您將分配$id
並且您確定沒有重復/ mysql錯誤。
注意:如果域屬於一個客戶端,請使用客戶端ID而不是使用域。 這樣,您將使用INT作為索引,該索引比VARCHAR快。 推薦代碼的想法相同。
您應該在MySQL中將列定義為INTEGER AUTO_INCREMENT PRIMARY KEY
。
執行插入時,請不要指定該列:
INSERT INTO referral (domain, date, referralcode) VALUES (?,?,?)
如果您需要剛剛生成的ID,可以使用函數mysql_insert_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.