INSERT куда хочу ...

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

iNiTro

Guest
INSERT куда хочу ...

Не получается вставить некоторые данные
под номером которым я хочу в базе данных.
т.е. вставить вторым и т.д.
INSERT вставляет только в конец базы данных.
Как вставить куда хочу ?
 
Ты не должен этого хотеть

Автоикрементный первичный ключ нужен для идентификации данных, а не для нумерации в определенном порядке.

Опиши решаемую задачу подробнее.
 
Хотел написать свой алгорит работы с деревьями ( поставлена такая задача - написать
на php программы в которой используется деревья ).
Для хранения я придумал такую схему
id, level, name
1 1 Roman
2 2 --- Roman1
3 2 --- Roman2
4 2 --- Roman3
5 3 --- --- Ana1
6 3 --- --- Ana2
7 2 --- Roman5
8 3 --- --- Katty
ну и т.д.
в таком случае храниня дерева удобно просматривать его, все ветки.
Встала задача вставить данные например на третий уровень -
2 2 --- Roman1
3 2 --- Roman2
4 3 --- --- Katty2 <== вот это то и надо вставить под номером 4
5 2 --- Roman3

Можно попросить не предлагать сомтреть статьи на phpClub насчет деревьев.
Уже прочитаны. Но хочется самому помучатся и разобраться ...
 
Создай неуникальное целочисленное поле, по которому будешь сортировать при выборке. А автоинкремент не трогай
 
или для формирования дерева тебе понадобится ещё поле,где будет храниться идентификатор родителя,тогда структура твоя будет иметь примерно такой вид:
id, level,par, name
1 1 0Roman
2 2 0--- Roman1
3 2 0--- Roman2
4 2 0--- Roman3
5 3 4--- --- Ana1
6 3 4--- --- Ana2
7 2 0--- Roman5
8 3 7--- --- Katty
захочешь создать ещё ветку,например от roman2,будет это выглядеть так:
id, level,par, name
1 1 0Roman
2 2 0--- Roman1
3 2 0--- Roman2
4 2 0--- Roman3
5 3 4--- --- Ana1
6 3 4--- --- Ana2
7 2 0--- Roman5
8 3 7--- --- Katty
9 6 3--- --- qwer
10 4 3-- -- asdfv
такие дела:)
 
to => Nutty
Такой способ хранения не эффективен для больших таблиц !
Level - это уровень погружения в дерево. Для корня он равен 1, для детей 2.
Подумай сам:
в моем способе ( если бы я умел вставлять куда хочу) для того чтобы
вывести все пользователю надо будет только сделать "select * from table".
и вывести попорядку.

Тебе же для того что бы вывести дерево надо будет использовать рекурсию.
Т.е. берешь корень - узнаешь его детей, проверяешь есть ли у детей снова дети,
если нет то выводим ... и если да то снова запускаем процесс и т.д.
В моем способе даже родителя как отдельное поле хранить не надо. Что бы
узнать его надо подниматся пока level !=level - 1, пока уровень не уменьшится на 1.
 
хех...рано или поздно ты всеравно придешь к тому,что надо использовать какую-то вложенность объектов.этот способ подойдет и для большой и для малой базы.теперь твой способ.
вот узнаешь ты как это делается,а потом по каким-то причинам(либо перейдешь на другую базу,либо в новой версии mysql что-то изменится)и тебе надо будет переделывать код:))
а про Level я не знал что у тебя это такое,поэтому поставил просто так.
 
iNiTro
если ты знаешь с каким номером id нужно вставить данные, то делаешь сначала
UPDATE table SET id=id+1 WHERE id >=4
потом INSERT с нужным тебе id
но для такого варианта, тебе придётся локировать таблицу.
ты ещё упоминал о большой таблице ... так вот, для большой таблицы update будет тормозить, т.к. будет перестраиваться индекс ...
даже если локировать, то всё равно нет гарантии, что дерево твоё не рассыпится ...
 
Из впроса следует, что id -- autoincremented PK.

Насколько логичны описанные тобой манипуляции с первичным ключом с точки зрения теории реляционных БД? (Риторический вопрос.)

Я думаю, об этом не следовало рассказывать. :)
 
lucas
к написанию своего поста меня поддтолкнула фраза уважаемого iNiTro

Можно попросить не предлагать сомтреть статьи на phpClub насчет деревьев.
Уже прочитаны. Но хочется самому помучатся и разобраться ...
особенно о мучениях ... :)
хочет, пусть мучается ...
твой вопрос можно считать дополнением моего поста ...
 
Да задача была более ли менее решена.
Для id я убрал AUTO_INCEREMENT
а для остальной части таблицы UPDATE table SET id=id+1 WHERE id >id_родителя.
После родителя вставляем нового ДЕТЯ с id равным id_родителя + 1
Для вывода SELECT * from main ORDER BY id

Я думаю можно один раз сделать UPDATE чтобы потом выводить за 1 просмотр базы.
SELECT * from main ORDER BY id - после этого по порядку выводим.
Иначе для того что бы вывести надо будет использовать многократное посмотр базы данных для того что узнать сколько детей и сколько у них снова детей.
Можно просто загнать всю базу данных в php массив и его потом сросматривать много - много раз ... А как там производительность хэш таблиц ???

Я конечно не знаю что быстрее UPDATE или просто SELECT или php array.
Надо будет попробовать ;-))) но для этого надо будет время ...
Всем thanks
 
iNiTro
всё это может работать, если эта таблица не будет связана ни с какой другой по своему id
другими словами "одинокое" дерево
в противном случае мученья тебе обеспечены ...
 
Для id я убрал AUTO_INCEREMENT
Глупость. Тебе ведь дерево не само по себе нужно. На ветках будет что-то завязано. Следовательно тебе нужен уникальный идентификатор. AUTO_INCEREMENT - лучший.
Но хочется самому помучатся и разобраться
Учиться на собственных ошибках - дилетанство
 
Сверху