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 / 90651
Accepted
John
John
Asked: 2015-01-31 09:30:23 +0800 CST2015-01-31 09:30:23 +0800 CST 2015-01-31 09:30:23 +0800 CST

A chave primária do PostgreSQL desaparece da tabela de teste

  • 772

Eu tenho um cenário um tanto complicado em que uma tabela de teste que criei com uma chave primária não retornará a chave primária. O pgAdmin III informa que não há restrições. Eu tenho todo o log de consulta do PostgreSQL e abaixo tenho a consulta que usei para criar a tabela de teste. Em seguida, soltei a chave primária em uma tabela de teste diferente e usei a consulta gerada (ainda não é uma consulta que executei manualmente) para me ajudar a pesquisar pgAdmin III soltando a chave primária na tabela em questão e não encontrei nada procurando por:

ALTER TABLE public.delete_key_bigserial DROP CONSTRAINT

A string 'DROP CONSTRAINT' aparece apenas uma vez no log de consulta desde 02/12/2014, semanas antes de eu criar as tabelas de teste. Agora entendo que uma chave primária pode ou não ser definida como bigserialou serialaté mesmo criou uma tabela sem uma chave primária definida como id para inteiro e, em seguida, definida idcomo a chave primária (outra lata de worms para todo 'outro dia ).

Em uma pergunta anterior , perguntei sobre como buscar a data_typeinclusão se fosse bigserialou serialpara a qual Erwin Brandstetter tinha uma excelente resposta. Ele forneceu duas consultas em particular, uma para buscar os data_types para todas as colunas e outra para buscar a data_typechave primária. Infelizmente, uma das tabelas de teste com as quais tenho testado não está retornando nenhum resultado.

SELECT a.attrelid::regclass::text, a.attname,
CASE a.atttypid
 WHEN 'int'::regtype  THEN 'serial'
 WHEN 'int8'::regtype THEN 'bigserial'
 WHEN 'int2'::regtype THEN 'smallserial'
 END AS serial_type
FROM   pg_attribute  a
JOIN   pg_constraint c ON c.conrelid  = a.attrelid AND c.conkey[1] = a.attnum 
JOIN   pg_attrdef   ad ON ad.adrelid  = a.attrelid
                       AND ad.adnum   = a.attnum
WHERE  a.attrelid = 'delete_key_bigserial'::regclass
AND    a.attnum > 0
AND    NOT a.attisdropped
AND    a.atttypid = ANY('{int,int8,int2}'::regtype[]) -- integer type
AND    c.contype = 'p'                                -- PK
AND    array_length(c.conkey, 1) = 1                  -- single column
AND    ad.adsrc = 'nextval('''
            || (pg_get_serial_sequence (a.attrelid::regclass::text, a.attname))::regclass
            || '''::regclass)';

A consulta funciona perfeitamente em todas as outras tabelas.

Eu só trabalho com PostgreSQL desde novembro de 2014 e MySQL desde cerca de 2011, então a melhor coisa que posso fazer AFAIK é buscar o máximo de dados relevantes que puder. Aqui está a consulta usada para criar a delete_key_bigserialtabela a partir do log de consulta:

CREATE TABLE public.delete_key_bigserial (id bigserial PRIMARY KEY NOT NULL)
WITH (OIDS = FALSE);

Simplifiquei a consulta de Erwin e usei-a na tabela para comparar os resultados em minha ferramenta de consulta com diferentes tabelas de teste nas quais a consulta funciona perfeitamente bem (em todos os quatro data_types):

SELECT * FROM pg_attribute a 
WHERE a.attrelid = 'delete_key_bigserial'::regclass
AND a.attnum > 0
AND NOT a.attisdropped
AND attname='id'
ORDER BY a.attnum;

+----------+---------+----------+---------------+--------+--------+----------+-------------+
| attrelid | attname | atttypid | attstattarget | attlen | attnum | attndims | attcacheoff |
+----------+---------+----------+---------------+--------+--------+----------+-------------+
| 46390    | id      | 20       | -1            | 8      | 20     | 0        | -1          |
+----------+---------+----------+---------------+--------+--------+----------+-------------+

+-----------+----------+------------+----------+------------+-----------+--------------+
| atttypmod | attbyval | attstorage | attalign | attnotnull | atthasdef | attisdropped |
+-----------+----------+------------+----------+------------+-----------+--------------+
| -1        | f        | p          | d        | t          | t         | f            |
+-----------+----------+------------+----------+------------+-----------+--------------+

+------------+-------------+--------------+--------+------------+---------------+
| attislocal | attinhcount | attcollation | attacl | attoptions | attfdwoptions |
+------------+-------------+--------------+--------+------------+---------------+
| t          | 0           |              |        |            |               |
+------------+-------------+--------------+--------+------------+---------------+

Erwin está derivando o tipo por meio da atttypidcoluna quando outras condições são atendidas, no entanto, a coluna/linha resultante é idêntica a outras tabelas que funcionam. Há outra tabela de catálogo que usei em minhas tentativas de determinar qual data_typeé a chave primária, então decidi comparar os resultados dessa tabela também por meio da seguinte consulta:

SELECT * FROM information_schema.columns
WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
AND table_name='delete_key_bigserial'
AND is_nullable='NO';

A única diferença para qualquer coluna/linha retornada (além do nome da tabela nas colunas table_namee ) era a coluna. A tabela retorna a coluna com o valor , para uma tabela de trabalho a consulta retorna . A (parte inferior da) documentação element_types do PostgreSQL descreve a coluna como:column_defaultdtd_identifierdelete_key_bigserialdtd_identifier201

Um identificador do descritor de tipo de dados do elemento. Atualmente, isso não é útil.

Eu estou supondo que esta é uma moda obsoleta/antiga que é mantida para propósitos herdados, embora possa simplesmente se referir à própria descrição? Não tenho certeza, mas é aqui que estou e nem tenho certeza se estou no caminho certo.

Prefiro lidar com o problema e aprender com o cenário do que desconsiderá-lo simplesmente porque é uma tabela de teste, pois um dia tenho certeza que terei que lidar com esse problema quando não for uma tabela de teste. Ficarei feliz em atualizar minha pergunta com informações relevantes que podem ajudar a rastrear qual é o problema.

postgresql primary-key
  • 1 1 respostas
  • 383 Views

1 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2015-01-31T11:45:42+08:002015-01-31T11:45:42+08:00

    Para uma tabela criada assim:

    CREATE TABLE public.delete_key_bigserial (id bigserial PRIMARY KEY NOT NULL);
    

    ... ambas as minhas consultas na resposta anterior (assim como pgAdmin, psql ou qualquer outro cliente decente) encontrariam a restrição PK. Se não estiver lá, você o removeu de alguma forma .
    Observe que minha primeira consulta só retorna a coluna se for o PK e um serialtipo - que é o caso do exemplo.

    Outra causa possível para a confusão: talvez você tenha mais de uma tabela nomeada delete_key_bigserialem seu banco de dados? Os nomes das tabelas são exclusivos apenas dentro de um único esquema. Teste com:

    SELECT * FROM pg_class WHERE relname = 'delete_key_bigserial';
    

    Para tornar sua consulta inequívoca, qualifique o esquema do nome da tabela:

    WHERE  a.attrelid = 'public.delete_key_bigserial'::regclass

    Existem maneiras de fazer a restrição "desaparecer" sem deixar um DROP CONSTRAINTem seus logs.

    • Solte e recrie a tabela.
    • Elimine e recrie o esquema ou banco de dados.
    • (Temporariamente) definir log_statementou outras configurações relevantes para que a instrução não seja registrada.
    • Manipular os catálogos do sistema diretamente (como superusuário) Internamente, a chave primária é definida contype = 'p'na tabela pg_constraint.
    • Edite os arquivos de registro.

    • etc.

    • 2

relate perguntas

  • Chaves primárias de caractere x número inteiro

  • 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