Вставка уникального кода в столбец не auto_increment

  • Автор темы Cyber_Atlant
  • Дата начала

Cyber_Atlant

Guest
Вставка части уникального кода-ключа в столбец не auto_increment

Здравствуйте!
Есть таблица с полями F1,F2,F3,F4,F5 PRIMARY KEY у этой таблицы (F1+F2+F3) В поле F1 (не auto_increment) заносится значение (максимальное имеющееся + 1). Алгоритм его вычисления такой:
Подготовка данных для INSERT строки (нахождение всяких значений и тд)
...
Запрос SELECT MAX(F1)
...
Запрос INSERT всей строки

Скажите пожалйста, Каким образом можно избежать ошибки, когда несколько юзеров одновременно сделают Запрос SELECT MAX(F1) и
будут делать INSERT записи с одинаковым значением в поле F1 ???

Спасибо за помощь :)
 

Demiurg

Guest
Я что-то не понял, почему нельзя использовать auto_increment ?
 

Cyber_Atlant

Guest
Так ведь auto_increment предполагает наличие только одного такого значения в столбце, а их там может быть много.
 

Demiurg

Guest
хм, а что в этих полях ?
Подход как то не соответсвует теории реляционных баз данных.
 

Cougar

Кошак
Думаю, поможет LOCK TABLES ...
...Хотя Demiurg прав - странная какая-то таблица...
 

Cyber_Atlant

Guest
Почему? Поля F1,F2,F3 числовые коды в совокупности дают уникальную запись. Для вычисления необходимости создания нового кода используются разные алгоритмы, но когда нужно создать новый, то каждый по принцыпу максимальный+1

-~{}~ 18.11.04 15:36:

Автор оригинала: Cougar
Думаю, поможет LOCK TABLES ...
А разве LOCK TABLES поможет не дать читать всем, кроме одного юзера, максимальное значение из поля, пока этот один юзер не выполнит инсерт нового значения?
 

Cougar

Кошак
Цитата из мануала:
If a thread obtains a READ lock on a table, that thread (and all other threads) can only read from the table. If a thread obtains a WRITE lock on a table, only the thread holding the lock can read from or write to the table. Other threads are blocked.
 

Cyber_Atlant

Guest
Тоесть можно сделать так:
Подготовка данных для INSERT строки (нахождение всяких значений и тд)
...
LOCK TABLES real_table READ
Запрос SELECT MAX(F1)
...
Запрос INSERT всей строки
UNLOCK TABLES
Но как же тогда юзер сможет сделать Запрос SELECT MAX(F1) если уже все будет заблокировано???
 

Demiurg

Guest
что за числовые коды ? ты можешь нормально объяснить что ты делаешь?
 

Cougar

Кошак
Cyber_Atlant
Этта... ты приведенную мной цитату из мануала внимательно читал? В частности вот это: ...only the thread holding the lock can read from or write to the table.... Так что - может сделать запрос, может.

PS: Присоединяюсь к вопросу Демиурга. Кошачье любопытство, знаешь ли :)
 

Cyber_Atlant

Guest
Поле F1 числовой код 9 знаков - код Объекта агрегата поставок
Поле F2 числовой код 9 знаков - код поставки у поставщика
Поле F3 числовой код 9 знаков - код поставщика
Вместе все - уникальный код товара
Когда алгоритм вычислит, что надо добавить запись, то вычисляются новые значения этих кодов. Не обязательно все сразу, но два раза все три кода в одной строке не встречаются.
Да даже если бы был один код, но который не уникально идентифицирует запись, то как его вычислять? Как сделать чтобы разные юзеры не получили один и тот же код для разного товара?
 

Cougar

Кошак
Cyber_Atlant
Чтобы не получили - есть разные способы. Чтобы не смогли записать - делаешь нужное поле UNIQUE.
 

tony2001

TeaM PHPClub
не понимаю почему нельзя использовать auto_increment'ный id + составной уникальный ключ по твоим полям.
 

Cyber_Atlant

Guest
Автор оригинала: Cougar
Cyber_Atlant
Этта... ты приведенную мной цитату из мануала внимательно читал? В частности вот это: ...only the thread holding the lock can read from or write to the table.... Так что - может сделать запрос, может.

PS: Присоединяюсь к вопросу Демиурга. Кошачье любопытство, знаешь ли :)
Как я понял, то только поток установивший блокировку WRITE может писать и читать таблицу.
Тоесть юзер и поток в данном случае означает одно и тоже?
Есть ли какая-нибудь связь между ними?
Четко не знаю, вот и спрашиваю :)

-~{}~ 18.11.04 16:35:

Автор оригинала: tony2001
не понимаю почему нельзя использовать auto_increment'ный id + составной уникальный ключ по твоим полям.
Уф, не понял, извини? Добавить еще одно поле?

-~{}~ 18.11.04 16:39:

Автор оригинала: Cougar
Cyber_Atlant
Чтобы не получили - есть разные способы. Чтобы не смогли записать - делаешь нужное поле UNIQUE.
со вставкой понятно. Мне иненно надо сделать так, чтобы в любой момент времени только один юзер мог вычислять новое значение, тоесть делать запрос селект макс(F1)
 

Cougar

Кошак
Cyber_Atlant Поток - это один экземпляр твоего скрипта, запущенный неважно от чьего имени. (определение не академическое, но суть ясна).
В общем, LOCK TABLES WRITE - то, что тебе требуется
 

Cyber_Atlant

Guest
Спасибо всем, кто помог мне разобраться с этой проблемой!!!
Блокировка заработала, но стало медленей теперь, кода вроде нормальные генерит, время покажет. Я тут придумал еще одну вещь. Создать табличку, в которую, перед вычислением нового значения кода, я буду кидать запись с названием таблицы, которую нельзя читать всем остальным, а после вставки записи буду удалять из таблицы с записями о блокированых таблицах. В принцыпе, наверно, это я "придумал велосипед", но тоже должно работать :)
 
Сверху