如何避免MySQL中INSERT上的重复条目?

时间:2011-11-25 14:34:04

标签: mysql

我的应用程序在注册新客户然后将其插入客户表时生成ID号。

生成ID的方法是读取最后一个ID号,然后将其递增1,然后将其插入表中。

该应用程序将在具有30个以上用户的网络环境中使用,因此至少有两个用户有可能(概率?)在保存阶段读取相同的最后一个ID号,这意味着两者都将获得相同的身份证号码。

我也在使用交易。我需要一个在其他网站上找不到的逻辑解决方案。

请回复说明,以便我能理解它。

1 个答案:

答案 0 :(得分:2)

使用自动增量,你可以获得mysql_insert_id属性发出的最后一个id。

如果由于某种原因这是不可行的,你可以让另一个表保持最后使用的id,然后在事务中递增它,然后将其用作插入表中的键。但是要进行两次转换,否则你将遇到同样的问题。这可能会变得混乱,但是这是一个额外的维护水平。 (将你的下一个id表重置为零,当它们仍然存在于相关的表格中时,事情就会迅速发展。

在插入操作期间(甚至没有稍微推荐),在桌子上放置一个独占锁定,你当前的解决方案就无法工作了。

好的,基于离开架构的扩展答案。

伪代码中的选项1

StartTransaction
try
  NextId = GetNextId(...) 
  AddRecord(NextID...)
  commit transaction
catch Primary Key Violation
  rollback transaction
  Do the entire thing again
end

显然你可能会在这里结束一个无限循环,不太可能,但可能,可能首先耗尽堆栈空间。

如果成功从队列中删除,您可以对请求进行排队,然后尝试处理这些请求。

但是让customerid成为一个汽车公司,整个问题都会出现问题。 它仍然是主键,你只需要解决它需要的东西,实际上你不会在insert语句中提供它,mysql会为你处理它。

您唯一需要记住的是,如果您需要自动创建的ID是在一次交易中请求它。

因此您的插入查询需要采用

形式
Insert SomeTable(SomeColumns) Values(SomeValues)
Select mysql_insert_id

或者如果多个语句妨碍了在start stransaction commit transaction对中包含两个语句。

相关问题