为什么不同的 postgres 表不能使用同名的索引?
我正在尝试将一些表从基本表更改为每月分区表。正常的解决方案似乎是
- 创建源表的分区副本(空)
CREATE TABLE copy (LIKE original INCLUDING INDEXES) PARTITION BY RANGE xxxx
- 将数据从源表复制到副本。
INSERT INTO copy (SELECT * FROM original WHERE ???)
- 删除源
DROP TABLE original
- 重命名分区表。
ALTER TABLE copy RENAME TO original
我当前的问题是,尽管CREATE TABLE ... LIKE ... INCLUDING INDEXES
将使用所有相同的字段名称和数据类型,但它将构成一组新的索引名称。由于各种原因,这些数据库上的索引需要符合固定的命名约定。
有没有办法复制一个表并将索引名称复制到?
同一架构中的两个索引不能具有相同的名称。表、索引、视图、序列、物化视图、复合数据类型和外表都共享同一个命名空间,模式名和对象名的组合必须是唯一的。
在两个表上使用相同索引名称的唯一方法是在不同的模式中创建副本。但是
CREATE TABLE ... (LIKE ... INCLUDING INDEXES)
无论如何都会将自己的名称分配给索引。您最好的选择可能是在不同的模式中创建副本,然后根据您的喜好重命名 PostgreSQL 创建的索引。
这是另一个想法:
pg_dump -s
表,创建一个新数据库,在那里恢复转储,重命名模式,pg_dump -s
再次将该转储恢复到原始数据库。