Mysql непоследовательная проблема вставки - PullRequest
1 голос
/ 18 апреля 2011

У меня есть таблица с 100 000 записей, описанная как:

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

Только поля, заполненные в этой таблице, являются первыми двумя, ID и Ticket. Теперь мне нужно назначить пользователя для этого билета по запросу. Как я могу это сделать? Как я могу найти, где находится следующий нулевой пользователь на столе?

Редактировать: объяснение сценария по запросу

Это своего рода система лотереи. Номера Билетов уже сделаны и внесены в таблицу. Теперь, когда пользователь подписывается на билет, его имя пользователя должно быть вставлено рядом со следующим доступным билетом, в поле пользователя. Я уверен, что есть намного более простой способ сделать это, вставив билет со всей информацией в новую таблицу, но это точное требование, настолько глупое, насколько это звучит.

Так, как я могу узнать, где находится следующий нулевой пользователь на столе?

Ответы [ 4 ]

0 голосов
/ 18 апреля 2011

Вы также можете сделать это в одном запросе:

UPDATE users SET user = [username] where id = 
(select min(id) from users where user is null) 
0 голосов
/ 18 апреля 2011

Найдите следующую NULL-строку, выполнив:

SELECT ID 
FROM Ticket
WHERE user IS NULL 
LIMIT 1;

Когда вы обновляете, хотя вам нужно быть осторожным, у вас нет условия гонки, когда другой процесс также получает такой же идентификатор.Вы можете предотвратить эту проблему с повторяющимся размещением, если в отдельной таблице будет храниться TicketAllocation, и вы получите уникальное ограничение внешнего ключа, указывающее на таблицу Ticket.

0 голосов
/ 18 апреля 2011

Предполагается, что 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 голосов
/ 18 апреля 2011

Какова схема сортировки таблицы?

Если номера Id последовательны, это должно работать:

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

Если номера Id не являются последовательными, и вы согласны с использованием естественной сортировки таблицы (отсортированной по мере ввода)

SELECT ID FROM TABLE WHERE user is null LIMIT 1
...