Estou tentando otimizar a estrutura de uma tabela. Para fazer isso, coloquei as colunas na ordem mais otimizada possível e executei esta consulta (simplificada):
INSERT INTO table_new ("id", "some_field", "some_other_field") SELECT "id", "some_field", "some_other_field" FROM table_current;
Então eu simplesmente renomeio a tabela e adiciono todos os mesmos índices e chaves estrangeiras.
ALTER TABLE "table_current" RENAME TO "table_old";
ALTER TABLE "table_new" RENAME TO "table_current";
ALTER TABLE "table_current" ADD PRIMARY KEY ("id") NOT DEFERRABLE INITIALLY IMMEDIATE;
Isso funcionou muito bem no passado, mas neste caso em particular, existem muitas outras tabelas com chaves estrangeiras em cascata nesta tabela.
Portanto, se eu recriar e renomear, todas as outras tabelas ainda farão referência table_old
em suas chaves estrangeiras em vez do novo table_current
.
Como faço uma migração de tabela como essa sem ter que recriar as chaves estrangeiras em todas as outras tabelas também?
Não há uma maneira fácil de contornar o problema. Ao descartar colunas que outras coisas estão referenciando, como exibições ou chaves estrangeiras, você deve informar manualmente todas as áreas do esquema que possuem dependências nessa coluna.
Não há nenhum atalho que eu conheça em torno disso. Ninguém realmente tem o hábito de reordenar as mesas. A maioria dos pedidos são por razões estéticas, no entanto, se você está realmente fazendo isso por um motivo válido (como embalagem de mesa), desejo-lhe boa sorte.
Tem sido um pedido de recurso por um tempo, e aparece com frequência.