2013-03-11 29 views
0

我正在使用mysql與PHP。我有這樣的學生表。我正在使用InnoDB引擎。php mysql將下一個序列號分配給該行

id int AUTO_INCREMENT 
regno int 
name varchar 

無論何時插入新學生,我都想分配下一個可用的校正值。例如前一個學生的名字是1,那麼下一個條目的值應該是2。自動增量在此不起作用,因爲它可能會造成間隙。 (我正在使用事務,因此在學生表中插入一行後,可能會導致回滾的查詢數量會減少很多,在這種情況下,儘管沒有插入實際記錄,但自動增量ID會增加。另外,我不在乎舊regnos之間是否存在差距......例如regno可能依次有1,2,3,5,10,11,12。現在當插入下一個學生時,我想爲這個學生選擇12 + 1 = 13。另外,我想確保regno不重複。 (雖然regno有一個UNIQUE索引,但我不想拋出錯誤,它應該得到下一個數字)。

我有兩個解決方案。 1 :(僞碼) a。查詢數據庫中的newregno = max(regno)+1 b。插入行時給學生分配newregno。

在這種情況下,我只關心應用程序的兩個實例可能同時查詢數據庫並得到相同的newregno導致重複。

2:使用觸發器...實際行插入後更新regno。 (我沒有多讀關於觸發器,但如果有人建議這是一個更好的方法,我會去做)

任何建議嗎?

編輯--- regno(註冊號碼)在將來可能不是唯一的,但會與其他一些列一樣是唯一的。當然/會話。所以請不要給我一個'自動增量'索引類型的解決方案。

+0

您可以在數據庫中使用自動遞增的regno。 – 2013-03-11 08:35:48

+0

@DevangRathod請完整閱讀該問題...我已經告訴過自動增量在這裏不起作用。 – Khan 2013-03-11 08:37:25

+0

是否有一個目的是我有兩列,我猜是'獨特' – Class 2013-03-11 08:38:36

回答

0

看一看這樣的: http://www.mysqlperformanceblog.com/2011/11/29/avoiding-auto-increment-holes-on-innodb-with-insert-ignore/

增量使用不同的算法來計算ID。您需要設置它以避免漏洞。

+0

更詳細的外觀:http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html – priyolahiri 2013-03-11 08:43:42

+0

@priyolahiri ...這是一篇很棒的文章,我將使用它在我未來的發展,但在目前的情況下,我不會使用自動增量(請檢閱我的編輯)。我認爲觸發器對我來說可能是一個很好的解決方案。 – Khan 2013-03-11 09:32:29

+0

或作爲事務的一部分,您可以執行SELECT MAX(column_name)FROM table_name;然後在進行新的插入/更新時分配給變量並增量? – priyolahiri 2013-03-11 09:40:27

相關問題