Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Как задать случайный первичный ключ?


Автор: AztEK 15.3.2008, 19:12
Мне нужно рализовать следующее: таблица, у каждой записи которой первичным ключом является число от 1000 до 9999. При вставке новой записи, её ключ должен вычисляться случайным образом. Первый пришедший мне в голову запрос
Код

INSERT INTO `test` SET `id` = RAND() * 1000

понятное дело, не работает — иногда ключи дублируется и возникает ошибка. Проверять на уровне PHP свободный ключ мне кажется слишком долго, особенно при большом количестве записей.

Подскажите, как можно сделать лучше?

Автор: SelenIT 15.3.2008, 20:16
Цитата(AztEK @  15.3.2008,  19:12 Найти цитируемый пост)
При вставке новой записи, её ключ должен вычисляться случайным образом.

Требование совершенно абсурдное. Первичный ключ - на то и первичный, чтобы быть удобным в первую очередь для самой базы, поэтому чаще всего и используется автоинкрементное поле (уникальное по определению). Для чего вообще это случайное число понадобилось? Не проще ли вносить случайность при выборке (order by rand() и т.д.)?

Автор: AztEK 15.3.2008, 20:25
Цитата(SelenIT @ 15.3.2008,  23:16)
Цитата(AztEK @  15.3.2008,  19:12 Найти цитируемый пост)
При вставке новой записи, её ключ должен вычисляться случайным образом.

Требование совершенно абсурдное. Первичный ключ - на то и первичный, чтобы быть удобным в первую очередь для самой базы, поэтому чаще всего и используется автоинкрементное поле (уникальное по определению). Для чего вообще это случайное число понадобилось? Не проще ли вносить случайность при выборке (order by rand() и т.д.)?

Делаю доску объявлений. Хочется, чтобы номер только что добавленного объявления не отображал количества уже добавленных. Создаётся иллюзия, что объявлений на сайте больше, чем на самом деле. Такое есть во многих сервисах.

Может быть, делать это на уровне БД — не лучшее решение, но другого я пока не могу придумать.

P.S. Если я неправильно использую понятие «первичный ключ» — извините. Имеется в виду некий идентификатор объявления.

Автор: SelenIT 15.3.2008, 20:50
AztEK, а просто начать автоинкремент с 1000 или 1234 (auto_increment=… при создании таблицы) не выход?

Автор: AztEK 15.3.2008, 22:02
Цитата(SelenIT @ 15.3.2008,  23:50)
AztEK, а просто начать автоинкремент с 1000 или 1234 (auto_increment=… при создании таблицы) не выход?

Немного не то, но в принципе на крайняк — выход.

Да и из принципа охота разобраться smile Где-то же это реализовано.

Автор: skyboy 15.3.2008, 22:21
AztEK, через триггеры можно сделать.
только такой первичный ключ - в топку. замедляет добавление, никак не ускорит(а в сравнении с "обычным"автоинкрементным вариантом - существенно замедлит) выборку, особенно - из нескольких связанных таблиц... да и от кого ты хочешь "прятать" идентификатор записи? от php-скрипта? если от человека, то пусть PHP-скрипт возвращает не id, а id * id  + id. или вообще - md5(id). или ещё как. зачем пихать случайно генерируемые данные в БД - не понимаю. пусть идентификатор будет вычисляемым... хотя, способ, предложенный SelenIT'ом намного проще и с тем же эффектом...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)