Quando insiro um registro preciso retornar o id inserido por RETURNING
. O problema é que a tabela é particionada e na tabela particionada não consigo usar RETURNING
. Eu executo várias consultas ao mesmo tempo, então estou precisando urgentemente de RETURNING
. Existe uma maneira de conseguir isso?
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?
Assumindo uma tabela pai como esta:
Esteja você usando uma regra ou um gatilho para desviar os INSERTs para as tabelas filhas, imediatamente após o INSERT você pode usar:
SELECT currval('parent_id_seq'::regclass);
para obter o último
id
inserido por sua sessão, independentemente de INSERTs simultâneos, cada sessão tendo sua própria cópia do último valor de sequência obtido.Sem ter uma visão geral de como você está gerenciando suas tabelas particionadas, é relativamente difícil avaliar o que você pode fazer para contornar essa limitação. Supondo que você esteja usando um paradigma de gatilho, para
RETURNING
funcionar como esperado, você terá que alterar asRETURN
cláusulas em suasBEFORE INSERT
funções deNULL
paraNEW
, pois aRETURNING
cláusula nunca receberá os valores inseridos do caso anterior (já que eles nunca são realmente inseridos em a tabela principal). Fazer essa alteração também passará as linhas inseridas para a tabela mestre, permitindo que aRETURNING
cláusula receba os resultados.No entanto, isso significa que ocorre uma gravação dupla, portanto, uma
AFTER INSERT
função de gatilho será necessária para remover os elementos duplicados. Embora isso obviamente incorra em sobrecarga adicional e efetivamente reduza a eficiência pela metade, ainda terá menos impacto do que osRULE
paradigmas (que podem exigir tanto trabalho de qualquer maneira), exceto, é claro, em cenários de inserção em massa. É uma troca de desempenho por consistência e capacidade de manutenção, mas contanto que isso seja entendido e os benefícios de usar tabelas particionadas em primeiro lugar mantenham os SLAs atendidos, acho que é uma concessão aceitável.Aqui está o SQL Fiddle completo para mostrar o que descrevi em ação. Observe que a
NewID()
função no topo é apenas para mostrar como isso funcionaria sem ter uma sequência disponível e não é de forma alguma uma sugestão de que a função em si seja uma boa ideia (existem plugins para UIDs globais apropriados se você quiser ir por esse caminho).