我正在努力解决有关mysql中主要ID的以下问题:
我有一个实体Client
和一个实体Purchase
,其中一个客户购买零到多,购买只有一个客户。
当我创建购买时,我想分配我自己的主键,该主键引用客户端和正在进行的号码,例如abc1,用于第一次购买客户端abc。购买表可能如下所示:
id | client
abc1 | abc
abc2 | abc
def1 | def
abc3 | abc
def2 | def
我的应用程序使用symfony2和doctrine2,所以我搜索并思考了一段时间,然后在PurchaseRepository中实现了一个createPurchase方法,该方法读取特定客户的购买量,添加一个并返回已添加id的已创建Purchase :
public function createPurchase($client){
$amount = $this->getAmountForClient($client) + 1;
$id= $client->getId() . $amount ;
return new Purchase($id);
}
此解决方案存在一些问题:
我现在还有另一种方法可以解决我的问题吗?我这样做完全错了吗?任何帮助表示赞赏!
答案 0 :(得分:2)
这就是AUTO_INCREMENT功能存在的原因,因此并发事务可以生成唯一的主键值。
要使用您自己的代码执行此操作,您必须在调用getAmountForClient()
之前使用LOCK TABLES Purchase WRITE
,以防止与导致重复键错误的其他事务的竞争条件。
没有人这样做。他们放弃了你所描述的自定义主键的想法,而只是使用AUTO_INCREMENT。