Лучшая альтернатива автонумерации первичных ключей - PullRequest
3 голосов
/ 15 марта 2010

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

Я просто слишком параноидален из-за недостатка места?

- отредактировано 03-16-2010 @ 1237 часов -

У меня был человек, который в то время, как мне показалось, был замечательным справочником по вопросам, связанным с Access, сказал мне, что идентификаторы репликации являются просто счетчиком количества копий элемента ... поэтому я никогда не исследовал его дальше , После количества ответов я модернизировал и принял ответ. Я полагаю, у меня был глупый момент для начинающего разработчика Accesss. Если серьезно, еще раз спасибо за всех, кто ответил!

Ответы [ 5 ]

1 голос
/ 15 марта 2010

Почему вы ограничены длинным целым числом? Когда вы указываете поле AutoNumber, вы можете указать ему использовать Replication ID вместо Long Integer, и это будет уникальное 128-битное значение, называемое GUID.

Хотя вы можете использовать текущую дату и время в качестве первичного ключа, вот почему бы и нет:

Текущая дата и время не так уникальны, как вы думаете . Если вы делаете записи очень быстро, вы можете в конечном итоге вставить два такта между тактами, в результате чего оба будут иметь одинаковое время. Или часы вашего компьютера могут быть просто сброшены назад. Или DST может закончиться, и если вы сохраняете местное время, у вас будет дублированное время.

1 голос
/ 15 марта 2010

GUID. Они довольно уникальны

http://en.wikipedia.org/wiki/Globally_Unique_Identifier

Вы не упомянули свой язык программирования. C # будет что-то вроде

String myKey = Guid.NewGuid().toString();
1 голос
/ 15 марта 2010

Как вы думаете, почему вам не хватит места? Возможно, вы не понимаете, насколько велико 64-битное целое число. Это позволяет около 10 миллиардов миллиардов записей. Если бы вы создавали 100 записей в секунду, понадобилось бы пять миллиардов лет для исчерпания целых чисел.

0 голосов
/ 30 декабря 2010

Очень простое решение - использовать Autonumber с опцией «Random» вместо «Increment». Я где-то читал, что, поскольку числа не являются смежными, это дает дополнительный бонус улучшения параллелизма при добавлении новых записей от нескольких клиентов одновременно.

0 голосов
/ 15 марта 2010

Согласно ответу Джона, вам вряд ли хватит длинных целых чисел. Но если вы предпочитаете уникальную строку, самое простое решение - это UUID. Он не требует ввода данных, но вероятность создания двух идентичных UUID незначительна.

Например, в Python:

import uuid
uuid.uuid4()

Функции UUID доступны на большинстве языков: http://en.wikipedia.org/wiki/Uuid

...