2010-12-15 4 views
3

В настоящее время у меня есть база данных, которая не управляется мной, и я не могу в нее вносить никаких изменений, поле id - это smallint 2 unsigned, что дает вам до 65535 идентификационных записей.Получить следующий ID не используется?

Моя проблема в том, что мне нужно повторно использовать идентификаторы из-за вышеуказанных ограничений, как я могу получить следующий полезный идентификатор в порядке или что вы будете делать, чтобы управлять вставками с указанными ограничениями?

ответ

8

Проверьте, есть ли 1. В противном случае:

SELECT MIN(a.id) + 1 AS smallestAvailableId 
FROM your_table AS a 
LEFT JOIN your_table AS a2 
     ON a2.id = a.id + 1 
WHERE a2.id IS NULL 
+0

Действительно довольно элегантный. – Konerak 2010-12-15 17:35:26

0

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

Чтобы ответить на ваш вопрос, что вы считаете «полезным» идентификатором? Прошу пролить свет на это. До тех пор, пока не будут использованы все идентификаторы, просто

SELECT MAX(id) + 1 FROM table; 

должен делать. Если установить критерий для «используемых» идентификаторов, таких как, например, повторно использовать все идентификаторы, помеченные старыми, то вы можете сделать:

SELECT MIN(id) FROM table WHERE is_old = 1; 

Тогда только на данно выбранный идентификатор.

+0

То, что я изначально думал, заключалось в том, чтобы сохранить обратите внимание на maxId, так как мне не нужно повторно использовать идентификатор до тех пор, пока он не достигнет предела 65535, как только max ID == 65535, тогда мне нужно проверить неиспользуемый ID – Prix 2010-12-15 17:35:11

+0

`unused` в этом контексте, вероятно, означает, что« нет строки с этим значением ", вот почему Alin's SELF-JOIN обнаруживает NULL настолько элегантно здесь. – Konerak 2010-12-15 17:41:40

2

Из тегов я выводил, что вам нужен идентификатор в Java.

Лично я бы не стал присоединяться к таблице с собой. Поскольку у вас не более 64K строк, я бы select id from table в Java и поиск id в Java. Один из способов поиска пробелов - сначала отсортировать массив (либо в SQL, либо в Java); поиск пробелов тогда становится тривиальным.

Если вы делаете это повторно, вы можете кэшировать массив и не запускать инструкцию SQL каждый раз, когда вам нужен идентификатор.

Независимо от того, что вы делаете, если в базе данных есть несколько клиентов, которые должны быть готовы к работе с условиями гонки, когда несколько клиентов будут пытаться использовать один и тот же идентификатор. Вам нужно будет либо использовать блокировку, либо уметь изящно восстанавливать повторную попытку неудачной вставки с другим идентификатором (я предполагаю, что существует столкновение уникальности в столбце id.)