PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Renomeie tabelas com segurança usando colunas de chave primária serial


serial não é um tipo de dados real. O manual afirma:

Os tipos de dados smallserial , serial e bigserial não são tipos verdadeiros, mas apenas uma conveniência de notação para criar colunas de identificadores exclusivos

O pseudo tipo de dados é resolvido fazendo tudo isso:

  • crie uma sequência chamada tablename_colname_seq

  • crie a coluna com o tipo integer (ou int2 / int8 respectivamente para smallserial / bigserial )

  • torne a coluna NOT NULL DEFAULT nextval('tablename_colname_seq')

  • faça a coluna possuir a sequência, para que ela seja descartada automaticamente

O sistema não saber se você fez tudo isso manualmente ou por meio do pseudo tipo de dados serial . O pgAdmin verifica os recursos listados e, se todos forem atendidos, o script DDL de engenharia reversa é simplificado com o serial correspondente tipo. Se uma das características não for atendida, essa simplificação não ocorre. Isso é algo que o pgAdmin faz. Para as tabelas de catálogo subjacentes é tudo a mesma coisa. Não há serial tipo como tal.

Não há como renomear automaticamente as sequências próprias. Você pode correr:
ALTER SEQUENCE ... RENAME TO ...

como você fez. O próprio sistema não se importa com o nome . A coluna DEFAULT armazena um OID ('foo_pkey_seq'::regclass ), você pode alterar o nome da sequência sem quebrar isso - o OID permanece o mesmo. O mesmo vale para chaves estrangeiras e referências semelhantes dentro do banco de dados.

O índice implícito para a chave primária está vinculado ao nome da restrição PK, que não alterar se você alterar o nome da tabela. No Postgres 9.2 ou posterior você pode usar
ALTER TABLE ... RENAME CONSTRAINT ..

para corrigir isso também.

Também pode haver índices nomeados em referência ao nome da tabela. Procedimento semelhante:
ALTER INDEX .. RENAME TO  ..

Você pode ter todos os tipos de referências informais ao nome da tabela. O sistema não pode renomear objetos que podem ser nomeados como você quiser. E não se importa.

Claro que você não quer invalidar o código SQL que faz referência a esses nomes. Obviamente, você não deseja alterar os nomes enquanto a lógica do aplicativo faz referência a eles. Normalmente, isso não seria um problema para nomes de índices, sequências ou restrições, já que normalmente não são referenciados por nome.

O Postgres também adquire um bloqueio nos objetos antes de renomeá-los. Portanto, se houver transação simultânea open que tenham algum tipo de bloqueio nos objetos em questão, seu RENAME a operação é interrompida até que essas transações sejam confirmadas ou revertidas.

Catálogos do sistema e OIDs


O esquema do banco de dados é armazenado em tabelas do catálogo do sistema no esquema do sistema pg_catalog . Todos os detalhes no manual aqui. Se você não sabe exatamente o que está fazendo, não deveria mexer nessas tabelas . Um movimento em falso e você pode quebrar seu banco de dados. Use os comandos DDL que o Postgres fornece.

Para algumas das tabelas mais importantes, o Postgres fornece tipos de identificadores de objetos e conversões de tipos para obter o nome do OID e vice-versa rapidamente. Como:
SELECT 'foo_pkey_seq'::regclass

Se o nome do esquema estiver no search_path e o nome da tabela é único, o que lhe dá o mesmo que:
SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';

A chave primária da maioria das tabelas de catálogo é oid e internamente, a maioria das referências usa OIDs.