2016-08-14 64 views
0

我有这个表relationsMySQL的插入,增量列值

ID Name Parent Pos 
================================ 
1  Alex  1  1 
2  Mary  1  2 
3  John  1  3 
4  Doe  2  1 
5  Bob  2  2 
6  Kate  2  3 

之前,我做的insert查询,我选择Parent ID和获得最后Pos位置,然后通过1

递增
$data = $DB2->query("SELECT * FROM relations 
      WHERE Parent='1' ORDER BY `Pos` DESC LIMIT 1"); 

      $results = $data->result_array(); 

      foreach($results as $row) { 
       $pos = $row['Pos']; //last position 

      } 


$pos = $pos + 1; 
    $DB2->query("INSERT IGNORE INTO relations (Name,Parent,Pos) VALUES('test',1,'$pos')"); 

有没有一种方法可以自动递增Pos列/ Parent列?或者,我目前的方式最有效率?

回答

0

如果您不担心竞争条件(两个刀片在同一时间发生的事情),那么你可以在一个声明中做到这一点:

INSERT IGNORE INTO relations (Name, Parent, Pos) 
    SELECT 'test', 1, MAX(pos) + 1 
    FROM relations 
    WHERE Parent = 1; 

不过,我肯定会建议你有一个独特的索引(Parent, Pos),并删除IGNORE - 如果发生错误,您想了解它。

您可以通过为作业使用触发器使这更安全。您也可以锁定表格,以便在特定插入过程中不会发生其他插入。这是一项昂贵的操作,并且如果存在繁重的事务负载,可能会降低系统速度。

+0

是的,我很担心比赛条件。您的方法是避免竞争条件的最佳方法吗? – mdnba50

+0

@ mdnba50。 。 。 '(Parent,Pos)'上的唯一索引可能就足够了,只要应用程序代码可以从失败的插入中恢复即可。否则,你将不得不进入锁定状态。 –