首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入时mysql的唯一记录

插入时mysql的唯一记录
EN

Stack Overflow用户
提问于 2011-11-21 06:14:13
回答 2查看 1.3K关注 0票数 15

我想实现一个新的推荐/提升系统。我的新系统,当用户注册一个特定的来源时,他是辅助的。来源可以是推荐(客户域名)和促销代码(例如: 50%折扣)中的任何内容。此源还有一个日期(y-m-d)。每个源id都是唯一的,并且多个用户可以具有相同的源id

例如:

代码语言:javascript
复制
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产生错误的风险?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-21 06:28:00

mysql页面:

的主要思想是使用ignore语句插入记录。如果使用IGNORE关键字,则在执行INSERT语句时发生的错误将被视为警告。例如,在不使用IGNORE的情况下,重复表中现有唯一索引或主键值的行将导致重复键错误,并且语句将中止。如果使用IGNORE,仍然不会插入行,但不会发出错误。然后使用mysql_insert_id检索最后一个ID

如果该记录不存在,它将插入该记录,并返回最后一个ID。

现在,如果没有返回记录,您可以进行选择。这意味着记录已经存在,所以只需使用它即可。

示例:

代码语言:javascript
复制
// 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更快。推荐代码也有同样的想法。

票数 25
EN

Stack Overflow用户

发布于 2011-11-21 06:27:35

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

在执行插入操作时,不要指定该列:

代码语言:javascript
复制
INSERT INTO referral (domain, date, referralcode) VALUES (?,?,?)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8205171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档