免责声明:这个问题与Stack Overflow上的问题类似,但是那里的答案都不适用于我的问题,我稍后会解释。
我正在尝试在Postgres中复制一个大表格(约40M行,100多列),其中许多列都被索引。目前我使用以下SQL语句:
CREATE TABLE <tablename>_copy (LIKE <tablename> INCLUDING ALL);
INSERT INTO <tablename>_copy SELECT * FROM <tablename>;
这种方法有两个问题:
- 它在数据导入之前添加索引,因此比创建没有索引的表并在复制所有数据后创建索引要慢得多。
- 这不会正确地复制“SERIAL”样式列。它不是在新表上设置一个新的“计数器”,而是将新表中该列的默认值设置为过去表的计数器,这意味着随着行的添加它不会递增。
我想要做的是使用某些神奇的命令直接进行精确复制,如果不可能,则复制带有所有约束但没有索引的表,并确保它们是“精神上”的约束(即SERIAL列的新计数器)。然后使用
SELECT *
复制所有数据,然后复制所有索引。
来源
- 关于数据库复制的Stack Overflow问题:这不是我要求的三个原因
- 它使用命令行选项
pg_dump -t x2 | sed 's/x2/x3/g' | psql
,在这种情况下我无法访问命令行 - 它在数据导入之前创建索引,这很慢
- 正如
default nextval('x1_id_seq'::regclass)
所证明的那样,它没有正确更新序列列
- 它使用命令行选项
- 重置Postgres表序列值的方法:这很好,但不幸的是它非常手动。
pg_dump -t x2 | sed 's/x2/x3/g' | psql
中使用命令行函数,而我无法访问。第二,在添加数据之前创建索引会非常慢!第三,SERIAL 的默认参数仍然引用第一个表default nextval('x1_id_seq'::regclass)
。这些都是我在问题中已经指出的三个缺陷。你告诉我没有任何解决方案吗?@peter - Erik