Замена auto_increment'а

tug

Новичок
Замена auto_increment'а

Делаю каталог предприятий. У каждого предприятия есть объекты, например магазины. Данные из csv. Для однозначной идентификации при обновлении данных через csv раньше я использовал наименование предприятия и адрес объекта. Но это оказалось крайне неудобно => Опечатка в названии предприятия или ошибка в адресе объекта влёчет появление, в сущности, двойников. Думаю как лучше это всё сделать. Самый очевидный вариант использовать уникальный идентификатор - целое число, который необходимо назначать прямо в csv. В этом случае идентификатор объекта - нормер предприятия + номер объекта. Проблемы вроде никакой нет, но там у меня есть ещё возможность управлять записям из административного интерфейса. Тогда для добавления предприятия нужно генерить этот идентификатор.

Вобщем вопрос как сделать это всё красивей, правильней, удобней, масштабируемей.
Помню, что где-то читал о том как решают проблему с идентификаторами в базах, где нет auto_increment, но не помню где.
 

Long

Новичок
tug, никакой "auto_increment" не решит проблемы "опечатка в названии предприятия или ошибка в адресе объекта влёчет появление двойников". тебе фактически нужно сделать синхронизицию двух баз, а для этого у тебя должен быть уникальный идентификатор в обоих базах, который однозначно идентифицирует объект в каждой из баз. такой идентификатор называют еще артикулом. заведи его в csv. это действие носит административный характер, т.е. нужно согласовать формат артикула со всем своим руководством и получить его согласие и поддержку, и никак с программированием не связано.
 

ForJest

- свежая кровь
tug
Ну вроде бы всё тривиально.
Ищешь по полям - есть ли уже такая запись. Если нет - то вставляешь.
Помню, что где-то читал о том как решают проблему с идентификаторами в базах, где нет auto_increment, но не помню где.
SELECT MAX(id) FROM my_table;
и следующий id это будет MAX + 1.
 

tug

Новичок
Всем спасибо, особенно ForJest.

Long
В качестве артикула я выбрал уникальное целое число. Тогда у каждого следующего предприятия это число на 1 больше.
В итоге это и есть auto_increment по-моему.
 

ailcat

Guest
Ремарк: если при вставке в таблицу с полем, имеющим признак auto_increment, не включать в INSERT это поле, запись будет вставлена со следующим после наибольшего существующего значением этого поля.

Полагаю, тебе больше подойдет такой алгоритм обработки ввода (неоптимальный, зато просто реализуется и надежно работает):
1) принимаешь за уникальный ключ идентификатор "название+адрес".
2) строчки с точно совпавшим ключом заменяешь; записи, для которых ключа в старой базе не существует, добавляешь в конец (см. выше, как это сделать быстро).
3) Делаешь выборку по LIKE из всей базы на соответствие вновь добавленным записям с "новым" ключом, и формируешь страницу "подтверждения", где выводишь для совпавших по LIKE записей ключ и CHECKBOX "удалить" против каждой строки, приплюсовываешь кнопочку "SUBMIT" и...
4) ...обработчиком убиваешь "лишние" записи (по ключи).
5) Изредка "чистишь" таблицу (OPTIMIZE_TABLE), чтоб "удаленные" записи не занимали место. Всё!
Удачи!

ПыСы: алгоритм был проверен на dBASE в локальном решении.
 

Andreika

"PHP for nubies" reader
tug
2 вопроса - если ты не знаешь как называется база в которой нет auto_increment, то ты ее наверняка не будешь использовать => зачем мучить код?
а предприятия можно удалить из базы?
 

tug

Новичок
Andreika
Я знаю как она называется, я не помню, где я про это читал =).
Просто там реализовано то, что мне нужно.
Можно всё.

ailcat
Красивый алгоритм. Я примерно так и хотел сначала делать.
У меня там названия предприятий а-ля "магазин" больше чем у половины. А адрес сам понимаешь можно написать "ул. Ленина д. 5", а можно "Ленина ул. 5", а можно ...
Спасибо, может быть так и сделаю в конечном итоге...
 
Сверху