Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как задать случайный первичный ключ? 
:(
    Опции темы
AztEK
Дата 15.3.2008, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 723
Регистрация: 4.1.2005

Репутация: нет
Всего: 18



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

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

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

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


--------------------
Linux is like wigwam -- no windows, no gates, apache inside.
PM MAIL Jabber   Вверх
SelenIT
Дата 15.3.2008, 20:16 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 6
Всего: 401



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

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


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AztEK
Дата 15.3.2008, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 723
Регистрация: 4.1.2005

Репутация: нет
Всего: 18



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

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

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

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

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


--------------------
Linux is like wigwam -- no windows, no gates, apache inside.
PM MAIL Jabber   Вверх
SelenIT
Дата 15.3.2008, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 6
Всего: 401



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


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
AztEK
Дата 15.3.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 723
Регистрация: 4.1.2005

Репутация: нет
Всего: 18



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

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

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

Это сообщение отредактировал(а) AztEK - 15.3.2008, 22:04


--------------------
Linux is like wigwam -- no windows, no gates, apache inside.
PM MAIL Jabber   Вверх
skyboy
Дата 15.3.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



AztEK, через триггеры можно сделать.
только такой первичный ключ - в топку. замедляет добавление, никак не ускорит(а в сравнении с "обычным"автоинкрементным вариантом - существенно замедлит) выборку, особенно - из нескольких связанных таблиц... да и от кого ты хочешь "прятать" идентификатор записи? от php-скрипта? если от человека, то пусть PHP-скрипт возвращает не id, а id * id  + id. или вообще - md5(id). или ещё как. зачем пихать случайно генерируемые данные в БД - не понимаю. пусть идентификатор будет вычисляемым... хотя, способ, предложенный SelenIT'ом намного проще и с тем же эффектом...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0779 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.