У меня есть стол Postgres 9.3, который имеет столбец с именем id
как PKEY, id
равен char(9)
, и разрешает только нижний регистр a-z0-9
, я использую Python с psycopg для вставки в эту таблицу.Как создать случайный идентификатор?
Когда мне нужно вставить в эту таблицу, я вызываю функцию Python get_new_id()
, мой вопрос в том, как сделать get_new_id()
эффективным?
У меня есть следующие решения, ни один из них не удовлетворяет меня.
a) Сгенерируйте большое количество id
s, сохраните их в какой-либо таблице, когда мне нужен новый идентификатор, I SELECT
один из этой таблицы, а затем удалите его из этой таблицы, а затем верните этот выбранный идентификатор. Нижняя сторона этого решения заключается в том, что ему необходимо поддерживать эту таблицу, в каждом вызове get_new_id()
также будет SELECT COUNT
, чтобы узнать, нужно ли мне генерировать больше идентификаторов для ввода в эту таблицу.
b) Когда вызывается get_new_id()
, он генерирует случайный идентификатор, а затем передает этот идентификатор в хранимую процедуру, чтобы проверить, используется ли этот идентификатор, если нет, мы хорошо, если да, сделаем b) снова. В нижней части этого решения, когда таблица становится больше, частота отказов может быть высокой, и существует вероятность того, что два вызова get_new_id()
в двух процессах будут генерировать один и тот же идентификатор, скажем, 1234567
, а 1234567
не используется PKEY тем не менее, поэтому при вставке один процесс завершится неудачно.
Я думаю, что это довольно старая проблема, какое идеальное решение?
Редактировать
Я думаю, что это был дан ответ, см комментарий Джон Клементс.
Есть «1e14» разные 9-символьные базы-36 строк, поэтому вероятность «высокого» столкновения сомнительна. – NPE
Возможно, вам удастся избежать [пользовательской последовательности] (http://www.postgresql.org/docs/8.3/static/sql-createsequence.html), начиная с произвольно большого числа, с довольно большим шагом (и, возможно, цикл), затем поставьте триггер, который вызывает 'get_new_id', который берет новый PK и создает его базовое 36. –
@JonClements Не думаю, что последовательность, я думаю, это так, вы должны сделать это ответом. (Почему вы говорите «может быть» в первом предложении, есть ли какие-либо ошибки в этом решении?) –