Não, você não precisa do cast para
regclass ao chamar uma função como nextval que aceita uma regclass parâmetro, pois há uma conversão implícita de text para regclass . Em alguns outros contextos, uma conversão explícita para regclass pode ser necessário. Explicação:
::regclass é uma conversão, como ::integer . regclass é um tipo de dados "mágico"; na verdade é um alias para oid , ou "identificador de objeto". Consulte Tipos de identificador de objeto
na documentação. Transmitindo para regclass é um atalho para dizer "este é o nome de uma relação, por favor converta-o para o oid dessa relação". Transmissões para regclass estão cientes do search_path , ao contrário de consultar pg_class para o oid de uma relação diretamente, então a conversão para regclass não é exatamente equivalente a subconsultar pg_class . Tabelas são relações. Assim são sequências e visualizações. Assim, você pode obter o oid de uma visão ou sequência lançando para regclass também.
Existem casts implícitos definidos para
text para regclass , portanto, se você omitir o cast explícito e estiver chamando uma função que aceita regclass o elenco é feito automaticamente. Então você não precisa dele em, por exemplo, nextval chamadas. Existem outros lugares onde você pode. Por exemplo, você não pode comparar
text diretamente com oid; então você pode fazer isso:regress=> select * from pg_class where oid = 'table1'::regclass;
mas não isso:
regress=> select * from pg_class where oid = 'table1';
ERROR: invalid input syntax for type oid: "table1"
LINE 1: select * from pg_class where oid = 'table1';
Apenas por diversão, tentei escrever uma consulta que executasse a operação equivalente de conversão para
regclass . Não use, é principalmente por diversão e como uma tentativa de demonstrar o que está realmente acontecendo. A menos que você esteja realmente interessado em como a coragem de Pg funciona, você pode parar de ler aqui. Pelo que entendi,
'sequence_name'::regclass::oid é aproximadamente equivalente à seguinte consulta:WITH sp(sp_ord, sp_schema) AS (
SELECT
generate_series(1, array_length(current_schemas('t'),1)),
unnest(current_schemas('t'))
)
SELECT c.oid
FROM pg_class c INNER JOIN pg_namespace n ON (c.relnamespace = n.oid)
INNER JOIN sp ON (n.nspname = sp.sp_schema)
WHERE c.relname = 'sequence_name'
ORDER BY sp.sp_ord
LIMIT 1;
exceto que é muito mais curto e muito mais rápido. Consulte Funções de informações do sistema para a definição de
current_schemas(...) , etc Em outras palavras:
- Obtenha uma matriz ab listando todos os esquemas aos quais temos acesso e emparelhe cada entrada com um número ordinal para sua posição na matriz
- Pesquisar
pg_classpara relações com nomes correspondentes e associe cada um ao seu namespace (esquema) - Classifique a lista de relações restantes pela ordem em que seus esquemas apareceram em
search_path - e escolha a primeira correspondência