PostgreSQL用LIKE建表会重命名索引,ALTER TABLE重命名却不生效?
解决CREATE TABLE LIKE复制表时索引自动重命名的问题
方案一:建表时避免索引自动重命名
放弃使用CREATE TABLE ... LIKE ...,直接基于原表的建表语句创建副本,完全控制索引和约束的名称:
- 获取原表的完整建表定义:
SELECT pg_get_tabledef('test');
- 将返回的SQL中的表名替换为临时表名(比如
temp_test),但保留原索引、约束的名称(比如原索引test_foo不做修改)。 - 执行修改后的SQL创建临时表,此时临时表的索引、约束名与原表完全一致,后续重命名表后无需额外调整。
方案二:重命名表后批量修正索引/约束名称
如果已经用LIKE创建了临时表,可以通过批量生成SQL语句来统一修正索引和约束名:
1. 生成索引重命名语句
执行以下SQL,会输出所有需要修改的索引重命名命令:
SELECT 'ALTER INDEX ' || quote_ident(indexname) || ' RENAME TO ' || quote_ident(replace(indexname, 'temp_test_', 'test_')) || ';' FROM pg_indexes WHERE tablename = 'temp_test';
复制并执行这些输出的语句,完成索引名修正。
2. 生成约束重命名语句
对于主键、外键、唯一约束等,执行以下SQL生成修改命令:
SELECT 'ALTER TABLE temp_test RENAME CONSTRAINT ' || quote_ident(conname) || ' TO ' || quote_ident(replace(conname, 'temp_test_', 'test_')) || ';' FROM pg_constraint WHERE conrelid = 'temp_test'::regclass;
复制执行这些语句,完成约束名称修正。
3. 重命名表
最后执行表重命名操作:
ALTER TABLE temp_test RENAME TO test;
内容的提问来源于stack exchange,提问作者sweintritt
相关产品推荐
相关产品推荐

