2012-01-01 124 views
4

沒有與一個int字段的表 - field_1。
我想插入一個新行。
field_1的值將是所有條目的最大值加1。
我已經試過:自動遞增手動

INSERT INTO table (field names, `field_1`) 
VALUES (values, '(SELECT MAX(field_1) FROM table)'); 

我得到的field_1 '0'。
我知道我可以在單獨的查詢中做到這一點。 有沒有辦法用一個查詢來執行這個動作?我的意思是來自php的一個電話。

我有一個自動遞增字段「身份證」,我要添加「位置」字段。我希望能夠讓位置的變化,但新的項目將始終具有最高位置

+3

爲什麼你要做到這一點時,MySQL的自動執行呢? – emaillenin 2012-01-01 14:40:20

+0

請解釋你正在努力實現的目標,而不是要求我們幫助你實現你認爲會做你正在努力實現的解決方案。 – 2012-01-01 14:46:13

+0

我已經有一個自動增量字段。所以當我嘗試將field_1設置爲自動增量時,我得到這個錯誤:不正確的表定義;可以只有一個自動列,它必須被定義爲一個鍵 – lvil 2012-01-01 14:49:50

回答

5

不管它是什麼,你正在嘗試做的,它不會工作,因爲它不能保證是原子。因此,並行執行的這個查詢的兩個實例保證在某個隨機時間點彼此混淆,導致跳過的數字和重複的數字。

之所以數據庫提供自動遞增正是以解決這一問題,在這些增加值的生成保證原子。

(最後,「自動遞增手動」是一個矛盾,它要麼將是「自動遞增」,否則將是「手動增量」。只是作爲一個聰明的驢子在這裏。)

編輯(後OP的編輯)來解決您的問題將是留下Position場零或NULL,然後執行UPDATE table SET Position = Id WHERE Position IS NULL

一個低效的方法。 (假設Id是表中的自動編號字段。)

一個有效的,但麻煩的辦法是離開Position場空當您沒有修改它,並給它一個價值只有當你決定對其進行修改。然後,你想讀的Position領域的每一次,使用CASE聲明:如果Position字段爲空,然後使用Id值;否則,使用值Position

EDIT2

如果你只有30行,我不明白爲什麼你甚至試圖保持正確的順序在數據庫中(考慮到OP在評論解釋後)。只加載所有行的數組,編程方式分配遞增值被發現是空的任何Position領域,當你的陣列的變化行的順序,剛修好的Position值,並更新數據庫中的所有30行。

+0

我從昨天開始一直在想這個,我編輯了我的答案以添加一些新的見解。 – 2012-01-02 19:24:17

0

ALTER TABLE table_name AUTO_INCREMENT = 1 allows the database to reset the AUTO_INCREMENT to:

MAX(auto_increment_column)+1

It does not reset it to 1.

This prevents any duplication of AUTO_INCREMENT values. Also, since AUTO_INCREMENT values are either primary/unique, duplication would never happen anyway. The method to do this is available for a reason. It will not alter any database records; simply the internal counter so that it points to the max value available. As stated earlier by someone, don't try to outsmart the database... just let it handle it. It handles the resetting of AUTO_INCREMENT very well. See gotphp

+0

答案中的鏈接似乎已過時。 – Pang 2016-11-24 09:21:46

0

試試這個:

INSERT INTO table (some_random_field, field_to_increment) 
SELECT 'some_random_value', IF(MAX(field_to_increment) IS NULL, 1, MAX(field_to_increment) + 1) 
FROM table; 

或者這樣:

INSERT `table` 
SET 
    some_random_field = 'some_random_value', 
    field_to_increment = (SELECT IF(MAX(field_to_increment) IS NULL, 1, MAX(field_to_increment) + 1) FROM table t); 

附:我知道這是遲了4年,但我正在尋找相同的答案。 :)