2011-06-05 80 views
1

我的問題是:我有一個auto_increment列的表。當我插入一些值時,一切都是正確的。 插入第一行:1 ID插入 第二行:ID 2Mysql auto_increment以最低值繼續

現在我想在ID插入一行10.

我的問題是,在此之後,只有ID 10之後插入的行(其是正常行爲)。

但我希望數據庫首先在填寫ID 3-9之前填寫。

有什麼建議嗎?

編輯:

爲了澄清:這是一個短網址我想建立自己。 我將id轉換爲一個單詞(a-zA-z0-9)進行搜索,並保存在數據庫中,我將它轉換爲一個數字,即表中的ID。

現在的問題是: 我縮短第一鏈路(沒有名字) - > ID是1,並且自動名稱1轉換爲-ZA-Z0-9其是

接着同一happenes - > ID是2,名字是b,這是2轉換。

接下來有趣,有人要命名鏈接test - > ID爲4597691這是轉換test

現在,如果有人增加了一個鏈接,沒有名字 - > ID是4597692 whichtesu因爲數字轉換。

我希望新的行會在

+0

你爲什麼要這樣做? ids 3-9失蹤怎麼了? – 2011-06-05 08:55:10

+0

我真的很想知道你爲什麼要面對這樣的情況。這可能最終會成爲一個非常棘手的問題,與您存儲的實際數據無關(考慮到這些ID只是內部的問題)。另外,看看UUID是否是你正在尋找的替代品 – Jai 2011-06-05 09:11:08

+0

我試圖讓自己的鏈接縮短。我將id轉換爲url名稱並返回。如果我與JohnDoeJohnDoe這個名字做一個簡短的鏈接,那麼下一個想要擁有隨機名的下一個將會有JohnDoeJohnDof,那可能太長了。 – Sonnenhut 2011-06-05 09:15:03

回答

0

你可以爲URL標識另一個整數列。然後

你的過程可能是這樣的:

  • 如果提供的鏈接生成默認名稱,那麼您只需插入新行,填充自動遞增值的URL ID列,然後將結果轉換爲相應的名稱。

  • 如果爲一個URL指定了一個自定義名稱,那麼在插入一行之後,URL ID列將填充從將所選名稱轉換爲整數所獲得的數字。

依此類推。查找整數ID時,您將使用URL ID列,而不是表格自動增量列。

如果我錯過了一些東西,請告訴我。

+0

這聽起來不錯,我認爲它比搜索每次都有更多的性能,我可能會實現這一點。謝謝。 – Sonnenhut 2011-06-05 10:28:33

0

你可以做6個虛擬插入和刪除/以後更新它們作爲你需要作出最後的差距(這裏3)自動插入。自動增量的概念在設計上意在限制應用程序或用戶對數字的控制,以確保輸入到表格中的每條記錄具有唯一的值。

+0

我認爲如果我繼續使用1.2.3,然後使用類似1000的東西,情況就不那麼好了。但是一個好主意 – Sonnenhut 2011-06-05 08:36:57

+0

建議不好,但僅僅是因爲請求不好。 +1使自動生成的點是ID可以提供**唯一性**而不是缺少空位**。 – 2011-06-05 09:27:55

0
ALTER TABLE MY_TABLE AUTO_INCREMENT = 3; 
+0

謝謝,但是如果我將數值插入到我的數據庫中(這是通過php頁面),我希望它們自動設置在第三行。我想我無法每次設置一行並添加1並保存它,稍後使用它(我認爲這不是很漂亮)。 – Sonnenhut 2011-06-05 08:35:40

0

您將不得不找到第一個未使用的id,將其存儲爲用戶變量,使用id作爲insert。

SELECT @id := t1.id +1 
FROM sometable t1 LEFT JOIN sometable t2 
ON t2.id = t1.id +1 WHERE t2.id IS NULL LIMIT 1; 

INSERT INTO sometable(id, col1, col2, ...) VALUES(@id, 'aaa', 'bbb', ...); 

你將不得不爲每個刀片上運行兩個查詢,如果你還是有差距,其由你來決定是否值得這樣做。

+0

這聽起來不錯,但**從table中選擇table.id其中id爲null limit 1 **返回空結果 – Sonnenhut 2011-06-05 09:06:41

+1

@gluca,**這不是** piotrm答案中的查詢,你在說什麼? – Johan 2011-06-05 09:16:42

+0

@Johan好吧,那麼查詢是什麼?你得到t1.id,其中t2.id爲空,並且只得到一個結果。我只修改它,它適用於我沒有說過的一張桌子。你能說你的SQL如何工作(不理解第三行的開始)? – Sonnenhut 2011-06-05 09:34:32

0

不是100%確定你想要什麼來實現,但這樣的事情可能工作:

drop table if exists foo; 
create table foo 
(
id int unsigned not null auto_increment primary key, 
row_id tinyint unsigned unique not null default 0 
) 
engine=innodb; 

insert into foo (row_id) values (1),(2),(10),(3),(7),(5); 

select * from foo order by row_id; 

+----+--------+ 
| id | row_id | 
+----+--------+ 
| 1 |  1 | 
| 2 |  2 | 
| 4 |  3 | 
| 6 |  5 | 
| 5 |  7 | 
| 3 |  10 | 
+----+--------+ 
6 rows in set (0.00 sec) 
+0

謝謝,但我的意思是,(關於你的例子)如果我現在插入:insert into foo(id,row_id)values(10,11),然後insert:insert into foo(row_id)values(12)then id row_id 12的行應該是7而不是11.希望我已經解釋了正確的 – Sonnenhut 2011-06-05 09:39:13