Eu criei uma tabela particionada com 1 partição. abaixo está o script para o mesmo:
CREATE TABLE public.ms (
id int8 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
a int8 NOT NULL,
b int4 NOT NULL,
c varchar(2000) NULL,
d int2 NOT NULL,
e bool NOT NULL DEFAULT false,
f timestamp NOT NULL DEFAULT timezone('UTC'::text, CURRENT_TIMESTAMP),
g jsonb NULL,
h int2 NOT NULL DEFAULT 1,
i bool NOT NULL DEFAULT true,
j int2 NULL,
CONSTRAINT me_pkey PRIMARY KEY (id)
)PARTITION BY RANGE (id) ;
CREATE TABLE ms3_0 PARTITION OF public.msg
FOR VALUES FROM (1) to (1000);
Agora, quando estou executando a instrução insert para isso por meio do loop abaixo, estou recebendo a mensagem de erro abaixo:
do $$
begin
for i in 1..1000
loop
INSERT INTO public.ms
(a, b, c, d, e, f, h, i , j)
VALUES(2, 0, '', 0, false, '2019-01-28 23:59:51', 1, true, 0);
end loop;
end;$$
Erro SQL [23514]: ERRO: nenhuma partição da relação "ms" encontrada para a linha Detalhe: A chave de partição da linha com falha contém (id) = (1001).
No entanto, até o id '1000', a partição já foi criada. Depois disso, eliminei a tabela existente e recriei a mesma tabela e partição novamente. Agora, comecei a inserir registros manualmente por meio de uma única instrução 'inserir'. Então, eu poderia inserir neles.
Depois disso, criei a 2ª partição como abaixo:
CREATE TABLE ms3_1 PARTITION OF public.ms
FOR VALUES FROM (1001) to (2000);
E, novamente, executou o mesmo loop para 1000 entradas e obteve o erro abaixo:
Erro SQL [23514]: ERRO: nenhuma partição da relação "ms" encontrada para a linha Detalhe: A chave de partição da linha com falha contém (id) = (1000)
No entanto, quando eu insiro no lote de 100 , como abaixo: eu poderia inserir isso:
do $$
begin
for i in 0..100
loop
INSERT INTO public.ms
(a, b, c, d, e, f, h, i, j)
VALUES(2, 0, '', 0, false, '2019-01-28 23:59:51', 1, true, 0);
end loop;
end;$$
De todo o cenário acima, tenho algumas dúvidas:
- No primeiro caso, por que não estava inserindo dados (1000 valores) na primeira partição quando a partição para os primeiros 1000 valores já foi criada?
- Depois de inserir 3-4 registros na primeira partição e depois de criar novamente outra partição (ms3_1) com 1000 registros, quando tento realizar a inserção em massa de 1000 registros na mesma tabela ms, por que não consigo fazer isso?
Qualquer ajuda/razão para isso será apreciada aqui. Desde então, isso me ajudará a configurar a partição de acordo com meus requisitos de negócios.
Posso responder à primeira pergunta, o resto da sua descrição é muito confuso para eu seguir.
As primeiras 1.000 linhas foram inseridas com sucesso na partição existente, mas a inserção da linha
id = 1000
falhou. Esse erro fez com que toda a transação fosse revertida, incluindo as linhas inseridas anteriormente.Uma coisa que também pode confundir você é que, com o particionamento de intervalo, a extremidade superior do intervalo é excluída. Então, se você criar uma partição
ele só pode acomodar valores de até 999. Isso parece surpreendente com tipos de dados discretos como
integer
, mas torna a vida muito mais fácil ao usar outros tipos de dados:é muito melhor do que ter que usar um limite superior de
2019-12-31 23:59:59.999999
.