AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 255010
Accepted
Channa
Channa
Asked: 2019-12-07 02:31:33 +0800 CST2019-12-07 02:31:33 +0800 CST 2019-12-07 02:31:33 +0800 CST

Comportamento da tabela de partição para Postgres

  • 772

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:

  1. 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?
  2. 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.

postgresql partitioning
  • 1 1 respostas
  • 1716 Views

1 respostas

  • Voted
  1. Best Answer
    Laurenz Albe
    2019-12-07T03:03:20+08:002019-12-07T03:03:20+08:00

    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 = 1000falhou. 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

    FOR VALUES FROM (1) to (1000)
    

    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:

    FOR VALUES FROM ('2019-01-01 00:00:00') TO ('2020-01-01 00:00:00')
    

    é muito melhor do que ter que usar um limite superior de 2019-12-31 23:59:59.999999.

    • 0

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve