![]() |
|
Модераторы: skyboy |
![]()
|
|
| Cetus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 18.4.2004 Репутация: 1 Всего: 1 |
Как описать создание следующей таблицы?
(id, Code, stringname) id - auto_increment; stringname - строка; Code состоит из XX.YY.ZZ, где XX - числовое значение, при добавлении: либо указывается в запросе либо равно id. при редактировании значение поля Code НЕ изменяется YY - дата; ZZ - символ или число. --------------------
Легко внести изменения в код.Трудно сделать это корректно. |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
Cetus, боюсь, в этом варианте невозможно. Более подробно опишите задачу - постараемся придумать.
Дело в том, что для составления поля Code требуется хранимка, а хранимок в стабильных версиях нет. -------------------- Теперь при чем :P |
|||
|
||||
| GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: 2 Всего: 83 |
Cetus
Для реализации твоего варианта придётся использовать дополнительный UPDATE после операции INSERT если XX=id... Если же XX!=id, то формируй поля Code сам перед вставкой записи в таблицу... |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
GoodBoy, в описаном варианте не прокатит:
-------------------- Теперь при чем :P |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
Cetus А может лучше разбить поле Code на три?
|
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
Имхо, лучше вычислять на выборке, а результат представлять как столбец.
-------------------- Теперь при чем :P |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
А смысл этого поля, зачем оно?
|
|||
|
||||
| Cetus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 18.4.2004 Репутация: 1 Всего: 1 |
Впринципе можно поле Code разбить на 3.
Мои поиски по документации привели к такому решению. на сервере описать функцию OnInsert для данной таблицы. полятаблицы: Id - auto_increment, Code - integer, } DateIn - Date, } бывшее поле Code IdTOV - char, } StringName - char(255); Смысл поля Code - уникальный код товара. Дело в том что запись о товаре может кочевать по разным таблицам, и поле Code должно быть постоянно. При поступлении товара на склад уникальный номер (использую Id-auto_increment) прописывается в поле Code. Что должна выполнять функция(OnInsert): при вставке новой записи выполняется проверка: если Code = 0 то Code := Id иначе ничего не менять. !! Хотелось бы увидеть пример функции, если тип поля (!) Code - integer и (!) Code - char(255) Как залить/описать на сервере данную функцию? Добавлено @ 12:18
дело в том, что между Insert Update может вклиниться другой клиент. Чтобы избежать этого надо блокировать таблицу. код будет вида lock table asd; inesrt .... update .... unlock table asd; мне такой вариант не очень нравиться, т.к. обращений к таблице достаточно много и это будет замедлять работу с сервером. --------------------
Легко внести изменения в код.Трудно сделать это корректно. |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
В этом нет ничего страшного. Создай поле sid, запиши туда какой-нибудь ид (например, MD5 хеш - имени товара ) и update делай по этому sid, в момент редактирования обнули sid, чтоб место не занимал. -------------------- Теперь при чем :P |
|||
|
||||
| GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: 2 Всего: 83 |
Cetus
Ну могу посоветовать тебе использовать Оракл... :-)))))))))))) |
|||
|
||||
| Cetus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 18.4.2004 Репутация: 1 Всего: 1 |
Ignat,
в том то и дело что _много_ товаров с _одинаковым имемем_, тут требуется различать между собой все товары с одинаковым именем. Заказчик - параноик --------------------
Легко внести изменения в код.Трудно сделать это корректно. |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
Решение:
1. изменить структуру бд - зранить весь товар в одной таблицн 2. использовать уникальные ключи: uniqid("") генерировать их в пхп. |
|||
|
||||
| Cetus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 18.4.2004 Репутация: 1 Всего: 1 |
Как написать серверную функцию вида:
OnInsert [Code - integer] Если Code = NULL or Code = 0 то Code := Id; или [Code - char(255)] Если Code = NULL or Code = '' то Code := IntToStr(Id) --------------------
Легко внести изменения в код.Трудно сделать это корректно. |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 6 Всего: 39 |
Cetus В стабильных венрсиях вроде бы нет хранимых процедур
читай предыдущее сообщение. |
|||
|
||||
| Cetus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 18.4.2004 Репутация: 1 Всего: 1 |
Как написать серверную функцию вида:
OnInsert [Code - integer] Если Code = NULL or Code = 0 то Code := Id; или [Code - char(255)] Если Code = NULL or Code = '' то Code := IntToStr(Id) у меня MySQL 4.0.2 в документации написано что можно добавлять пользовательские процедуры. сервер MySQL, клиент на Delphi. так что PHP использовать не могу. предлагал клиенту использовать GUID: не понравилось, сказал, что слишком длинный ключ --------------------
Легко внести изменения в код.Трудно сделать это корректно. |
|||
|
||||
| Ignat |
|
||||||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
Угу, только для этого Мускуль перекомпилить придется, а процедуру писать на сях.
Временный ID можно срандомизить в клиенте, не обязательно же использовать имя товара - возьми, например, текущее время в миллисекундах, плюс рандом, плюс артикул товара и направление ветра. Это же нужно только на один запрос - потом сотрешь. -------------------- Теперь при чем :P |
||||||
|
|||||||
| Cetus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 18.4.2004 Репутация: 1 Всего: 1 |
НЕТ! идентификатор товара нужен постоянно!
тем более что: 1. MD5 может совпасть при достаточно большом обьеме информации. 2. MD5 слишком длинное символьное представление хотелось бы что нибудь покороче. P.S. т.е. никак не прикрутить функции к серверу? а если подгружать динамически во время работы сервера, через клиента? --------------------
Легко внести изменения в код.Трудно сделать это корректно. |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
А кто говорит, что его не будет. Я тебе предлагаю сделать временный идентификатор. На случай, если во время между insert и update кто-то вставит строку, то ты мог определить какую строку вставил именно твой клиент, а после изменить именно эту строку, вставив постоянный идентификатор. Хотя по идее, если insert, update следуют друг за другом, то на таблице будет стоять блокировка записи. -------------------- Теперь при чем :P |
|||
|
||||
| Cetus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 18.4.2004 Репутация: 1 Всего: 1 |
требуется чтобы любой клиент не мог прочитать данную запись с еще неустановленным идентификатором.
для этого нужно либо чтобы стояла полная блокировка таблицы (этот вариант отпадает), либо данную запись блокировать по чтению. P.S. спасибо за идею с MD5, я понял суть --------------------
Легко внести изменения в код.Трудно сделать это корректно. |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
В таком случае, нужно использовать таблицы InnoDB. В них есть блокировка строк. В соседнем топике есть ссылка. -------------------- Теперь при чем :P |
|||
|
||||
| Cetus |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 18.4.2004 Репутация: 1 Всего: 1 |
Ignat, Secandr, GoodBoy
Спасибо ! --------------------
Легко внести изменения в код.Трудно сделать это корректно. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |