Обсуждение: SQL tree duplication

Поиск
Список
Период
Сортировка

SQL tree duplication

От
"Philippe Lang"
Дата:
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)
referencesdocuments (id) 
);

create table line_details ( id serial, name varchar(50), line_id integer, primary key (id), foreign key (line_id)
referenceslines (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.

Regards,

Philippe Lang


Re: SQL tree duplication

От
tv@fuzzy.cz
Дата:
> 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