插入时的唯一记录mysql

时间:2011-11-20 22:14:13

标签: php mysql insert

我想实施一个新的推荐/促销系统。我的新系统,当用户注册一个特定的来源时,他就会得到他的帮助。来源可以是来自referal(客户域)和促销代码(例如:50%折扣)的任何内容。该来源也有一个日期(y-m-d)。每个源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产生错误?

2 个答案:

答案 0 :(得分:25)

来自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快。推荐代码的想法相同。

答案 1 :(得分:0)

您应该将MySQL中的列定义为INTEGER AUTO_INCREMENT PRIMARY KEY

进行插入时,请勿指定该列:

INSERT INTO referral (domain, date, referralcode) VALUES (?,?,?)

如果您需要刚刚生成的ID,可以使用函数mysql_insert_id