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!
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 |