2016-08-14 98 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)'上的唯一索引可能就足夠了,只要應用程序代碼可以從失敗的插入中恢復即可。否則,你將不得不進入鎖定狀態。 –