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

iNiTro

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

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

lucas

Guest
Ты не должен этого хотеть

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

Опиши решаемую задачу подробнее.
 

iNiTro

Guest
Хотел написать свой алгорит работы с деревьями ( поставлена такая задача - написать
на 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 насчет деревьев.
Уже прочитаны. Но хочется самому помучатся и разобраться ...
 

tashkentchi

Новичок
Создай неуникальное целочисленное поле, по которому будешь сортировать при выборке. А автоинкремент не трогай
 

Nutty

Новичок
или для формирования дерева тебе понадобится ещё поле,где будет храниться идентификатор родителя,тогда структура твоя будет иметь примерно такой вид:
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
такие дела:)
 

iNiTro

Guest
to => Nutty
Такой способ хранения не эффективен для больших таблиц !
Level - это уровень погружения в дерево. Для корня он равен 1, для детей 2.
Подумай сам:
в моем способе ( если бы я умел вставлять куда хочу) для того чтобы
вывести все пользователю надо будет только сделать "select * from table".
и вывести попорядку.

Тебе же для того что бы вывести дерево надо будет использовать рекурсию.
Т.е. берешь корень - узнаешь его детей, проверяешь есть ли у детей снова дети,
если нет то выводим ... и если да то снова запускаем процесс и т.д.
В моем способе даже родителя как отдельное поле хранить не надо. Что бы
узнать его надо подниматся пока level !=level - 1, пока уровень не уменьшится на 1.
 

Nutty

Новичок
хех...рано или поздно ты всеравно придешь к тому,что надо использовать какую-то вложенность объектов.этот способ подойдет и для большой и для малой базы.теперь твой способ.
вот узнаешь ты как это делается,а потом по каким-то причинам(либо перейдешь на другую базу,либо в новой версии mysql что-то изменится)и тебе надо будет переделывать код:))
а про Level я не знал что у тебя это такое,поэтому поставил просто так.
 

chira

Новичок
iNiTro
если ты знаешь с каким номером id нужно вставить данные, то делаешь сначала
UPDATE table SET id=id+1 WHERE id >=4
потом INSERT с нужным тебе id
но для такого варианта, тебе придётся локировать таблицу.
ты ещё упоминал о большой таблице ... так вот, для большой таблицы update будет тормозить, т.к. будет перестраиваться индекс ...
даже если локировать, то всё равно нет гарантии, что дерево твоё не рассыпится ...
 

lucas

Guest
Из впроса следует, что id -- autoincremented PK.

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

Я думаю, об этом не следовало рассказывать. :)
 

chira

Новичок
lucas
к написанию своего поста меня поддтолкнула фраза уважаемого iNiTro

Можно попросить не предлагать сомтреть статьи на phpClub насчет деревьев.
Уже прочитаны. Но хочется самому помучатся и разобраться ...
особенно о мучениях ... :)
хочет, пусть мучается ...
твой вопрос можно считать дополнением моего поста ...
 

iNiTro

Guest
Да задача была более ли менее решена.
Для 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
 

chira

Новичок
iNiTro
всё это может работать, если эта таблица не будет связана ни с какой другой по своему id
другими словами "одинокое" дерево
в противном случае мученья тебе обеспечены ...
 

tashkentchi

Новичок
Для id я убрал AUTO_INCEREMENT
Глупость. Тебе ведь дерево не само по себе нужно. На ветках будет что-то завязано. Следовательно тебе нужен уникальный идентификатор. AUTO_INCEREMENT - лучший.
Но хочется самому помучатся и разобраться
Учиться на собственных ошибках - дилетанство
 
Сверху