Por que diferentes tabelas postgres não podem usar Ãndices com o mesmo nome?
Estou tentando alterar várias tabelas de tabelas básicas para tabelas particionadas mensais. A solução normal parece ser
- Crie uma cópia particionada (vazia) da tabela de origem
CREATE TABLE copy (LIKE original INCLUDING INDEXES) PARTITION BY RANGE xxxx
- Copie os dados da tabela de origem para a cópia.
INSERT INTO copy (SELECT * FROM original WHERE ???)
- Solte a fonte
DROP TABLE original
- Renomeie a tabela particionada.
ALTER TABLE copy RENAME TO original
Meu problema atual é que, embora CREATE TABLE ... LIKE ... INCLUDING INDEXES
use todos os mesmos nomes de campo e tipos de dados, ele criará um novo conjunto de nomes de Ãndice. Por vários motivos, os Ãndices nesses bancos de dados precisam estar em conformidade com uma convenção de nomenclatura fixa.
Existe uma maneira de copiar uma tabela e copiar os nomes dos Ãndices?
Dois Ãndices no mesmo esquema não podem ter o mesmo nome. Tabelas, Ãndices, exibições, sequências, exibições materializadas, tipos de dados compostos e tabelas estrangeiras compartilham o mesmo namespace, e a combinação de nome de esquema e nome de objeto deve ser exclusiva.
A única maneira de ter os mesmos nomes de Ãndice em ambas as tabelas seria criar a cópia em um esquema diferente. Mas
CREATE TABLE ... (LIKE ... INCLUDING INDEXES)
atribuirá seus próprios nomes aos Ãndices de qualquer maneira.Sua melhor opção talvez seja criar a cópia em um esquema diferente e então renomear os Ãndices que o PostgreSQL criou de acordo com sua preferência.
Aqui está outra ideia:
pg_dump -s
as tabelas, crie um novo banco de dados, restaure o dump lá, renomeie o esquemapg_dump -s
novamente e restaure esse dump para o banco de dados original.