Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Firebird, Interbase > копирование структуры с id, parent_id, text |
Автор: Sed0Y 16.4.2010, 14:43 | ||||
есть у меня таблица (в firebird), с полями FID, FPARENT_ID, FTEXT есть некие данные типа:
нужно скопировать в ту же таблицу что бы бала та же структура только новые ИД и парентИД
как это реализовать - Можно программно, можно ХПками? |
Автор: Gluttton 16.4.2010, 18:33 |
Т.е. не меняя "вхождения" одних элементов в другие нужно все значения первичных и внешних ключей увеличить на 9? |
Автор: Sed0Y 17.4.2010, 01:30 | ||
нет, увеличивать их не нужно нужно создать такую же структуру, только что бы ли другие ИД (gen_id()) |
Автор: Gluttton 17.4.2010, 01:38 |
Что понимается под структурой? Структура таблицы в БД? Или же структура дерева хранимых в БД элементов? |
Автор: Sed0Y 17.4.2010, 02:36 | ||
структура дерева хранимых в БД элементов |
Автор: Gluttton 17.4.2010, 02:40 |
Рекурсивно обходишь дерево и обновляешь элементы... http://forum.vingrad.ru/index.php?showtopic=276790&view=findpost&p=1998789 |
Автор: Sed0Y 17.4.2010, 03:03 | ||
Gluttton, вы меня конечно простите, но я не на столько сильно владею СКЛ - я не понимаю :( особенно как рекурсивно обойти и обновить элементы... ![]() если Вас не затруднит, не могли бы пример для меня сделать? а то это все дело мне нужно на завтра до вечера доделать.... |
Автор: Sed0Y 17.4.2010, 04:13 | ||||
Вот картинка, может так будет понятно: 1- картинка, это у наст есть уже что-то 2 - мы ее хотим сохранить как отдельную 3 - мы имеем 2-к орг структуры с одинаковой структурой (дерево) http://www.radikal.ru |
Автор: Gluttton 17.4.2010, 11:25 |
Я так понимаю, что есть некоторая БД, а в ней таблица с древовидной структурой. Некое клиентское приложение обеспечивает доступ к данным этой таблицы (судя по всему с возможностью модификации данных)... Задача сохринить в БД внесенные на стороне клиентского приложения изменения... Это то, что я понял из картинки ![]() |
Автор: Gluttton 17.4.2010, 11:50 |
Если FPARENT_ID является внешним ключем и на него наложено ограничение каскадного обновления, то вопрос обновления ключевых полей решается автомитически на уровне СУБД и это вообще не вопрос. Ну а если нет, то хочу заметить, что если вопросы: - удаление узла со всеми его дочерними элементами; - переименование отдельного узла; - применение маски при переименовании к узлу и его дочерним элементам; - удаление узла со всеми его дочерними элементами. Представляются мне решаемыми (и ответ на них можно найти по приведенной мною ссылке). То вот задача "перезаписи" ключевых полей у меня и в голове не укладывается (собственно говоря как и то зачем это нужно ![]() Дело в том, что для реализации задачи необходиомо обходить дерево строго сверу-вниз! Т.к. при случайном доступе к элементам мы рискуем изменить первичный ключ поля после того, как он уже был "учтен" запросом и был задан как код родительского элемента. Т.о. (первое что приходит в голову) необходимо создать временную таблицу, в которой элементы основной таблицы будут размещены сверху-вних (по некоторому дополнительному полю), в данном случае порядок записией совподает с первичным ключем. После необходимо создать копию исходной таблицы и добавить в неё поле для нового первичного ключа. Затем в цикле необходимо для всех записей вызывать некую процедуру, которая бы в этой новой таблице последовательно перебирала записи сверху-вниз и ориентируясь по старому первичному ключу обновляла бы записи. Всё это выглядет более чем сумбурно, но ничего более простого мне в голову не приходит... |
Автор: Sed0Y 17.4.2010, 13:38 | ||||||
все - спасибо, решил проблему, создал темповую таблицу, туда все запихнул проабдейтил и выгрузил куда нужно ![]()
|