2011-04-18 97 views
1

我有10萬條記錄的表描述爲:Mysql的非順序插入問題

ID primary unique int (5) 
Ticket unique int (5) 
user varchar (20) 

填寫該表的字段只有前兩個,身份證和票證。我需要現在根據請求分配一個用戶到那張票。我怎樣才能做到這一點?我如何找到下一個空用戶在桌面上的位置?

編輯:解釋方案的要求

它各種各樣的彩票系統。票號已經被製作並填入表中。現在,當用戶註冊一張票時,他們的用戶名必須插入到下一個可用票的旁邊,位於用戶字段中。我相信這是一個更簡單的方法,通過將票據與所有信息插入到一個新表格中,但這確實是一個愚蠢的要求。

那麼我怎樣才能找出下一個空用戶在桌子上的位置?

+0

您已經有ID列,按ID列插入用戶。 – Stewie 2011-04-18 18:05:15

+0

@Stewie,怎麼樣? INSERT INTO TABLE table(user)VALUES('user')WHERE id = ??? – Prof 2011-04-18 18:11:12

+0

你能解釋你的情況嗎?哪個表格包含這些信息?這張桌子的作用是什麼?你想如何使用這個ID和票? – 2011-04-18 18:11:56

回答

0

該表的排序方案是什麼?

如果ID號是順序可以這樣:

SELECT ID FROM TABLE WHERE user is null ORDER by ID LIMIT 1 

如果身份證號碼是不連續的,你是用表的自然排序(排序的,因爲他們進入)

SELECT ID FROM TABLE WHERE user is null LIMIT 1 
OK
0

查找下一個空行做:

SELECT ID 
FROM Ticket 
WHERE user IS NULL 
LIMIT 1; 

當您更新雖然you'l我必須小心你沒有競爭條件與另一個進程也獲得相同的ID。通過讓單獨的表保存TicketAllocation併爲其指定一個指向Ticket表的唯一外鍵約束,可以防止此重複分配問題。

0

這裏假設ID是自動遞增的。

開始通過找到的第一條記錄,其中用戶字段爲空:

Select * from users where user is null order by id asc limit 1; 

然後填寫它:

Update users set user = [username] where id = [id from select]; 
+0

請注意,ID是** not ** autoincremented,請參閱上面問題中的表格佈局。 – Johan 2011-04-18 20:07:29

+0

@Johan - 他確實提到過,雖然似乎喜歡我的回答。在我看來,從他描述他的問題的方式來看,他並沒有考慮通過ID選擇,而只是在考慮Ticket字段(它不會是順序的)。 – Shauna 2011-04-19 20:28:06

0

你也可以做一個單一的查詢:

UPDATE users SET user = [username] where id = 
(select min(id) from users where user is null)