我想实现一个新的推荐/提升系统。我的新系统,当用户注册一个特定的来源时,他是辅助的。来源可以是推荐(客户域名)和促销代码(例如: 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引用代码可以从client1混合到客户端2
我如何确保当有人注册时(它是免费注册的,我们现在每小时有超过1000个),我们不会有重复的记录,也不会有mysql产生错误的风险?
发布于 2011-11-21 06:28:00
从mysql页面:
的主要思想是使用
ignore语句插入记录。如果使用IGNORE关键字,则在执行INSERT语句时发生的错误将被视为警告。例如,在不使用IGNORE的情况下,重复表中现有唯一索引或主键值的行将导致重复键错误,并且语句将中止。如果使用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更快。推荐代码也有同样的想法。
发布于 2011-11-21 06:27:35
您应该将MySQL中的列定义为INTEGER AUTO_INCREMENT PRIMARY KEY。
在执行插入操作时,不要指定该列:
INSERT INTO referral (domain, date, referralcode) VALUES (?,?,?)如果需要刚刚生成的ID,可以使用函数mysql_insert_id
https://stackoverflow.com/questions/8205171
复制相似问题