Re: traitement par lots et sequence

Anthony Nowocien <[email protected]> Tue, 11 Jun 2019 16:46:59 +0200
Newsgroups gmane.comp.db.postgresql.french
Message-ID <CAH5RRoPrfcvmeCBDfLU3D=5=mQUTWbSoDWZVikCDEkJV6Sgeyg@mail.gmail.com>
--0000000000007d9db0058b0d5e8b
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Bonjour Pierre,

Peux-tu utiliser la clause RETURNING de l'INSERT?

Exemple :
INSERT INTO t(a,b,c) VALUES (1,'a','aa') RETURNING a;

WITH ins_t_mere AS(INSERT INTO t(a,b,c) VALUES (1,'a','aa') RETURNING a)
INSERT INTO t_fille SELECT a, 'b', 'bb') FROM ins_t_mere;

Voir https://www.postgresql.org/docs/current/sql-insert.html

Dans la partie VALUE, tu pourras peut-=C3=AAtre aussi utiliser DEFAULT pour=
 ta
colonne d'ID.

Anthony

On Tuesday, June 11, 2019, CRUMEYROLLE Pierre <[email protected]>
wrote:
> bonjour
>
> probl=C3=A9me :
>
> soit 2 tables : T_meres et T_filles li=C3=A9es par  T_meres.idMere
>
> je veux faire du traitement par lots pour avoir des performances car gros
volumes
>
> donc insertion par lots des T_meres sous la forme suivante
>
> insert into T_meres idMere,datamere values
((1,datam1),(2,datam2),(3,datam3), .... (n,datamn));
>
> idem insertion par lots des T_filles sous la forme suivante
>
> **** les n filles de la m=C3=A9re 1 *****
>
> insert into T_filles idFils,idMere,datamere values
((1,1,dataf1),(1,1,dataf2),(1,1,dataf3), .... (n,1,datafn));
> insert into T_filles idFils,idMere,datamere values
((2,1,dataf1),(2,1,dataf2),(2,2,dataf3), .... (2,1,datafn));
> .......
> insert into T_filles idFils,idMere,datamere values
((n,1,dataf1),(n,1,dataf2),(3,1,dataf3), .... (n,1,datafn));
>
> **** les n filles de la m=C3=A9re 2 *****
>
> insert into T_filles idFils,idmere,datamere values
((1,2,dataf1),(2,2,dataf2),(3,2,dataf3), .... (n,2,datafn));
> insert into T_filles idFils,idmere,datamere values
((1,2,dataf1),(2,2,dataf2),(3,2,dataf3), .... (n,2,datafn));
> .......
> insert into T_filles idFils,idmere,datamere values
((1,2,dataf1),(2,n,dataf2),(3,n,dataf3), .... (n,n,datafn));
>
> etc ....
>
> Ma question :
> Comment recuperer ou provisionner la plage de sequence balay=C3=A9 dans
l'insert des m=C3=A9res pour l'utiliser dans l'insert des filles dans un
traitement par lots  de fa=C3=A7on la plus =C3=A9fficace ?
>
> merci pour toute id=C3=A9e
>
>
>

--0000000000007d9db0058b0d5e8b
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Bonjour Pierre,<br><br>Peux-tu utiliser la clause RETURNING de l&#39;INSERT=
?<br><br>Exemple :<br>INSERT INTO t(a,b,c) VALUES (1,&#39;a&#39;,&#39;aa&#3=
9;) RETURNING a;<br><br>WITH ins_t_mere AS(INSERT INTO t(a,b,c) VALUES (1,&=
#39;a&#39;,&#39;aa&#39;) RETURNING a)<br>INSERT INTO t_fille SELECT a, &#39=
;b&#39;, &#39;bb&#39;) FROM ins_t_mere;<br><br>Voir <a href=3D"https://www.=
postgresql.org/docs/current/sql-insert.html">https://www.postgresql.org/doc=
s/current/sql-insert.html</a><br><br>Dans la partie VALUE, tu pourras peut-=
=C3=AAtre aussi utiliser DEFAULT pour ta colonne d&#39;ID.<br><br>Anthony<b=
r><br>On Tuesday, June 11, 2019, CRUMEYROLLE Pierre &lt;<a href=3D"mailto:p=
[email protected]">[email protected]</a>&gt; wrote:<br>&gt; =
bonjour<br>&gt;<br>&gt; probl=C3=A9me :<br>&gt;<br>&gt; soit 2 tables : T_m=
eres et T_filles li=C3=A9es par=C2=A0 T_meres.idMere<br>&gt;<br>&gt; je veu=
x faire du traitement par lots pour avoir des performances car gros volumes=
<br>&gt;<br>&gt; donc insertion par lots des T_meres sous la forme suivante=
<br>&gt;<br>&gt; insert into T_meres idMere,datamere values ((1,datam1),(2,=
datam2),(3,datam3), .... (n,datamn));<br>&gt;<br>&gt; idem insertion par lo=
ts des T_filles sous la forme suivante<br>&gt;<br>&gt; **** les n filles de=
 la m=C3=A9re 1 *****<br>&gt;<br>&gt; insert into T_filles idFils,idMere,da=
tamere values ((1,1,dataf1),(1,1,dataf2),(1,1,dataf3), .... (n,1,datafn));<=
br>&gt; insert into T_filles idFils,idMere,datamere values ((2,1,dataf1),(2=
,1,dataf2),(2,2,dataf3), .... (2,1,datafn));<br>&gt; .......<br>&gt; insert=
 into T_filles idFils,idMere,datamere values ((n,1,dataf1),(n,1,dataf2),(3,=
1,dataf3), .... (n,1,datafn));<br>&gt;<br>&gt; **** les n filles de la m=C3=
=A9re 2 *****<br>&gt;<br>&gt; insert into T_filles idFils,idmere,datamere v=
alues ((1,2,dataf1),(2,2,dataf2),(3,2,dataf3), .... (n,2,datafn));<br>&gt; =
insert into T_filles idFils,idmere,datamere values ((1,2,dataf1),(2,2,dataf=
2),(3,2,dataf3), .... (n,2,datafn));<br>&gt; .......<br>&gt; insert into T_=
filles idFils,idmere,datamere values ((1,2,dataf1),(2,n,dataf2),(3,n,dataf3=
), .... (n,n,datafn));<br>&gt;<br>&gt; etc ....<br>&gt;<br>&gt; Ma question=
 :<br>&gt; Comment recuperer ou provisionner la plage de sequence balay=C3=
=A9 dans l&#39;insert des m=C3=A9res pour l&#39;utiliser dans l&#39;insert =
des filles dans un traitement par lots=C2=A0 de fa=C3=A7on la plus =C3=A9ff=
icace ?<br>&gt;<br>&gt; merci pour toute id=C3=A9e<br>&gt;<br>&gt;<br>&gt;

--0000000000007d9db0058b0d5e8b--