comportamiento transaccional WITH

From: Hellmuth Vargas <hivs77(at)gmail(dot)com>
To: Lista Postgres ES <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: comportamiento transaccional WITH
Date: 2017-08-10 19:33:31
Message-ID: CAN3Qy4qB6Cqgnd2zufU4orq68c-pbG6FfyHA7j4=W77LdzD9sQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola Lista

Estaba revisando porque unas sentencias se ejecutaban y otras no con WITH y
prepare este script para que ustedes me ayuden a entender:

test=# create table padre(id int primary key, texto text);
CREATE TABLE
test=# create table hijo(id int primary key, texto text, padre_id int
references padre(id));
CREATE TABLE
test=# begin transaction;
BEGIN
test=# with base as(
test(# insert into padre(id,texto)
test(# select a.dato,chr(dato) from generate_series(33,255,1) as a(dato)
returning id,texto
test(# ),hijos as (
test(# insert into hijo(id, texto, padre_id)
test(# select -a.id,'el char de ' || a.id || 'es: ' || texto,a.id from base
as a
test(# )
test-# select * from
test-# padre as a
test-# join hijo as b on a.id=b.padre_id;
id | texto | id | texto | padre_id
----+-------+----+-------+----------
(0 rows)

no sale nada pero si en la misma transacción ejecuto nuevamente el ultimo
select:

test=# select * from
test-# padre as a
test-# join hijo as b on a.id=b.padre_id;
id | texto | id | texto | padre_id
-----+--------+------+--------------------------+----------
33 | ! | -33 | el char de 33es: ! | 33
34 | " | -34 | el char de 34es: " | 34
35 | # | -35 | el char de 35es: # | 35
36 | $ | -36 | el char de 36es: $ | 36
37 | % | -37 | el char de 37es: % | 37
38 | & | -38 | el char de 38es: & | 38
39 | ' | -39 | el char de 39es: ' | 39
40 | ( | -40 | el char de 40es: ( | 40
41 | ) | -41 | el char de 41es: ) | 41
42 | * | -42 | el char de 42es: * | 42
43 | + | -43 | el char de 43es: + | 43
44 | , | -44 | el char de 44es: , | 44
45 | - | -45 | el char de 45es: - | 45
46 | . | -46 | el char de 46es: . | 46
47 | / | -47 | el char de 47es: / | 47
48 | 0 | -48 | el char de 48es: 0 | 48
49 | 1 | -49 | el char de 49es: 1 | 49
50 | 2 | -50 | el char de 50es: 2 | 50
51 | 3 | -51 | el char de 51es: 3 | 51
52 | 4 | -52 | el char de 52es: 4 | 52
53 | 5 | -53 | el char de 53es: 5 | 53
54 | 6 | -54 | el char de 54es: 6 | 54
55 | 7 | -55 | el char de 55es: 7 | 55
56 | 8 | -56 | el char de 56es: 8 | 56
test=# rollback;
ROLLBACK

-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------

test=# begin transaction;
BEGIN
test=# with base as(
test(# insert into padre(id,texto)
test(# select a.dato,chr(dato) from generate_series(33,255,1) as a(dato)
returning id,texto
test(# ),hijos as (
test(# insert into hijo(id, texto, padre_id)
test(# select -a.id,'el char de ' || a.id || 'es: ' || texto,a.id from
padre as a ---no inserta
test(# )
test-# select * from
test-# padre as a
test-# join hijo as b on a.id=b.padre_id;
id | texto | id | texto | padre_id
----+-------+----+-------+----------
(0 rows)

No inserto en el hijo.

test=# select * from
test-# padre as a
test-# join hijo as b on a.id=b.padre_id;
id | texto | id | texto | padre_id
----+-------+----+-------+----------
(0 rows)

test=# select * from padre;
id | texto
-----+--------
33 | !
34 | "
35 | #
36 | $
37 | %
38 | &
39 | '
40 | (
41 | )
42 | *
43 | +
44 | ,
45 | -
46 | .
47 | /
48 | 0
49 | 1
50 | 2
51 | 3
52 | 4
53 | 5
54 | 6
55 | 7
56 | 8
test=# select * from hijo;
id | texto | padre_id
----+-------+----------
(0 rows)

test=# rollback;
ROLLBACK

-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------

test=# begin transaction;
BEGIN
test=# insert into padre(id,texto)
test-# select a.dato,chr(dato) from generate_series(33,255,1) as a(dato);
INSERT 0 223
test=#
test=# with elimina as (
test(# delete from padre where id%2=0 returning id,texto
test(# ),hijos as (
test(# insert into hijo(id, texto, padre_id)
test(# select -a.id,'el char de ' || a.id || 'es: ' || a.texto,a.id from
padre as a returning id, texto, padre_id
test(# )
test-# select * from
test-# hijos as b;
ERROR: insert or update on table "hijo" violates foreign key constraint
"hijo_padre_id_fkey"
DETAIL: Key (padre_id)=(34) is not present in table "padre".

ok aunque en hijos emplee la tabla padre.

test=#
test=# rollback;
ROLLBACK

-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------

test=# begin transaction;
BEGIN
test=# with base as(
test(# insert into padre(id,texto)
test(# select a.dato,chr(dato) from generate_series(33,255,1) as a(dato)
returning id,texto
test(# ),hijos as (
test(# insert into hijo(id, texto, padre_id)
test(# select -a.id,'el char de ' || a.id || 'es: ' || texto,a.id from
padre as a ---no inserta
test(# )
test-# select * from
test-# padre as a
test-# join hijo as b on a.id=b.padre_id;
id | texto | id | texto | padre_id
----+-------+----+-------+----------
(0 rows)

aquí no ve los registros de la tabla padre que se habían insertado en
base.....

test=# select * from hijo;
id | texto | padre_id
----+-------+----------
(0 rows)

test=# select * from padre;
id | texto
-----+--------
33 | !
34 | "
35 | #
36 | $
37 | %
38 | &
39 | '
40 | (
41 | )
42 | *
43 | +
44 | ,
45 | -
46 | .
47 | /
48 | 0
49 | 1
50 | 2
51 | 3
52 | 4
53 | 5
54 | 6
55 | 7
56 | 8
test=#

test=# rollback;
ROLLBACK
--
Cordialmente,

Ing. Hellmuth I. Vargas S.
Esp. Telemática y Negocios por Internet

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Hellmuth Vargas 2017-08-10 19:49:02 Re: comportamiento transaccional WITH
Previous Message Emanuel Calvo 2017-08-10 18:47:21 Re: lo que se queda fuera de un join