Combinei uma maneira de determinar o que data_type
é data_type
usado na sintaxe ao criar uma nova tabela com base na página wiki do PostgreSQL .
Se houver algo errado com minha consulta, preciso realmente saber o que , em um determinado cenário, o prejudicaria no contexto explícito de ter uma consulta ou consultas a serem executadas em um banco de dados/tabela puramente de teste para modificar esse banco de dados/tabela, então execute isto query para testar quaisquer falsos positivos.
SELECT pg_attribute.attname,
format_type(pg_attribute.atttypid, pg_attribute.atttypmod),
CASE
WHEN format_type(pg_attribute.atttypid, pg_attribute.atttypmod)='bigint' THEN 'bigserial'
WHEN format_type(pg_attribute.atttypid, pg_attribute.atttypmod)='integer' THEN 'serial'
END AS type
FROM pg_index, pg_class, pg_attribute
WHERE pg_class.oid = 'delete2'::regclass
AND indrelid = pg_class.oid
AND pg_attribute.attrelid = pg_class.oid
AND pg_attribute.attnum = any(pg_index.indkey)
AND indisprimary;
Aqui está uma tabela com uma chave primária que não retorna a chave primária com esta consulta:
CREATE TABLE delete_key_bigserial (
test1 integer,
id bigserial NOT NULL,
col1 text,
col2 text,
test2 integer
);
Sua consulta falharia porque o nome padrão de um número inteiro é "inteiro", não "int". Você pode evitar esse tipo de erro comparando o
regtype
OID interno em vez de uma representação de texto. Muitos tipos de dados básicos têm vários nomes de alias, todos eles resolvem para o mesmo tipo registrado interno.Além disso, você pode simplificar e melhorar bastante:
Embora isso melhore a consulta, ainda não está fazendo o que você espera .
Só porque uma coluna inteira é (parte da) chave primária, isso ainda não a torna uma
serial
coluna. Aqui está uma avaliação detalhada do queserial
é:Você não encontra nada para a tabela apresentada, pois está baseando sua consulta em
pg_index
, que não tem nada a ver com tipos seriais. Uma série não precisa ser indexada, apenas as chaves primárias são indexadas.Soluções seguras
Apenas detecte o tipo serial do
PRIMARY KEY
:Não retorna nada se o PK não for do tipo serial.
Dirigindo-se ao comentário de @jpmc26Uma verificação simplificada para apenas:
verificaria apenas se existe uma sequência "de propriedade" da coluna, mas não se o padrão da coluna também está definido para extrair números da sequência. A documentação:
Para mostrar TODAS as colunas com o tipo de dados adequado - substituído pelo
serial
tipo apropriado quando aplicável:A verificação no padrão da coluna pode ser interrompida com configurações exóticas para
search_path
. Não testei todas as combinações.db<>mexa aqui