2011-04-18 102 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)