簡體   English   中英

插入時的唯一記錄mysql

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM