PG11 Particionamiento y PKs

From: Stephen Amell <StephenAmell(at)inbox(dot)lv>
To: "pgsql-es-ayuda(at)lists(dot)postgresql(dot)org" <pgsql-es-ayuda(at)lists(dot)postgresql(dot)org>
Subject: PG11 Particionamiento y PKs
Date: 2018-12-20 14:08:33
Message-ID: a83e8e66-f61b-6449-029a-ce0a3dfb7228@inbox.lv
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola Lista!

Como andan?

Hoy les escribo porque tengo un problema con el nuevo particionamiento
de postgres 11, el objetivo es conservar la PK de una tabla
particionando por fecha.

En un prototipo cree una tabla, copiando la idea de la original:

CREATE TABLE public.daf
(
    id serial NOT NULL,
    fecha timestamp without time zone,
    testo character varying(100),
    PRIMARY KEY (id)                       ---> le digo que pk quiero
) partition by range ( fecha );            ---> y por que quiero particionar

No le gusta, ya lo veía venir por lo visto en la docu:

ERROR:  insufficient columns in PRIMARY KEY constraint definition
DETAIL:  PRIMARY KEY constraint on table "daf" lacks column "fecha"
which is part of the partition key.
SQL state: 0A000

Pruebo considera la fecha parte de la pk...

CREATE TABLE public.daf
(
    id serial NOT NULL,
    fecha timestamp without time zone,
    testo character varying(100),
    PRIMARY KEY (fecha, id)
) partition by range ( fecha );

-- OK, la creo

Pongo un par de hijas para probar rápidamente:

CREATE TABLE dafant partition of daf for values from ('-infinity') to
('2018-11-01');
CREATE TABLE dafdic partition of daf for values from ('2018-11-01') to
('2018-12-01');
CREATE TABLE dafene partition of daf for values from ('2018-12-01') to
('2018-12-31');
CREATE TABLE dafpos partition of daf for values from ('2019-01-01') to
('infinity');

Cargo un par de registros:

INSERT INTO public.daf(     fecha, testo) values  ( '2018-11-01', 'dos');
INSERT INTO public.daf(     fecha, testo) values  ( '2019-11-01', 'dosbis');

select * from daf;

daf=> select * from daf;

 id |        fecha        | testo
----+---------------------+--------
  5 | 2018-11-01 00:00:00 | dos
  6 | 2019-11-01 00:00:00 | dosbis

(2 rows)

hasta aca todo bien, ahora confirmo la pk compuesta:

daf=> INSERT INTO public.daf(id, fecha, testo) values  ( 5,
'2018-11-01', 'dos');
ERROR:  duplicate key value violates unique constraint "dafdic_fecha_id_key"

ahora cambiando la fecha para que la combinación no de:

daf=> INSERT INTO public.daf(id, fecha, testo) values  ( 5,
'2018-10-01', 'dos');
INSERT 0 1

daf=> select * from daf;
 id |        fecha        | testo
----+---------------------+--------
  5 | 2018-10-01 00:00:00 | dos                  <-- DUP ID
  5 | 2018-11-01 00:00:00 | dos                  <-- DUP ID
  6 | 2019-11-01 00:00:00 | dosbis
(3 rows)

Hasta acá, todo esperado, tengo dos id 5 para dos fechas distintas, pero
me mata no poder conservar la pk que necesito que es solo el campo ID.

Con la replica por triggers, esto lo tengo resuelto, pero me extraña que
con la nueva forma no haya saltado esto.

¿Alguna sugerencia o workarround para estos casos?

Mil gracias!

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2018-12-20 14:39:29 Re: PG11 Particionamiento y PKs
Previous Message Martín Marqués 2018-12-11 13:29:48 Re: versión de postgres en producción