Re: SQL tree duplication
От | tv@fuzzy.cz |
---|---|
Тема | Re: SQL tree duplication |
Дата | |
Msg-id | 23962.217.77.161.17.1201183749.squirrel@mail.fuzzy.cz обсуждение исходный текст |
Ответ на | SQL tree duplication ("Philippe Lang" <philippe.lang@attiksystem.ch>) |
Список | pgsql-sql |
> Hi, > > I have the following kind of sql structure, in 3 levels: > > ----------------------- > create table documents ( > id serial, > name varchar(50), > primary key (id) > ); > > create table lines ( > id serial, > name varchar(50), > document_id integer, > primary key (id), > foreign key (document_id) references documents (id) > ); > > create table line_details ( > id serial, > name varchar(50), > line_id integer, > primary key (id), > foreign key (line_id) references lines (id) > ); > ----------------------- > > I'd like to be able to "duplicate" a document, with all of its lines and > line details. > > Is there any easy way to do that with Postgresql? The only solution I > can think of at the moment is to loop through all lines and line > details, and replace foreign keys properly with values fetch with > "currval". It should work just fine, but I was wondering if some > advanced features of Postgresql could help in this situation. You will have to do that in 3 steps (one for each table), but looping may not be necessary - just use INSERT ... SELECT ... syntax. Something like INSERT INTO Lines SELECT FROM Lines WHERE document_id = OLD_ID; But it depends on primary keys in the Lines and Line_details tables - if the primary keys are composed (and the document_id is part of them) then there is no problem with duplicities. Otherwise you'll have to solve it somehow, and looping may be necessary. Tomas
В списке pgsql-sql по дате отправления: