免责声明:此问题与此处的堆栈溢出问题相似,但是这些答案都无法解决我的问题,我将在后面解释。
我正在尝试在postgres中复制一个大表(〜4000万行,100多个列),在其中索引了许多列。目前,我使用以下SQL:
CREATE TABLE <tablename>_copy (LIKE <tablename> INCLUDING ALL);
INSERT INTO <tablename>_copy SELECT * FROM <tablename>;
此方法有两个问题:
- 它在数据摄取之前添加索引,因此比创建没有索引的表要花费更多的时间,然后在复制所有数据后再建立索引。
- 这不会正确复制“ SERIAL”样式列。它没有在新表上设置新的“计数器”,而是将新表中列的默认值设置为过去表的计数器,这意味着它不会随着行的添加而增加。
表的大小使索引成为实时问题。这也使得转储到文件然后重新注册变得不可行。我也没有命令行的优势。我需要在SQL中执行此操作。
我想做的就是要么用一些奇迹命令直接复制一个精确的副本,要么(如果不可能)复制带有所有约束但没有索引的表,并确保它们是“精神上的”约束(又名SERIAL列的新计数器)。然后使用a复制所有数据,SELECT *
然后复制所有索引。
资料来源
有关数据库复制的堆栈溢出问题:这不是我要问的三个原因
- 它使用命令行选项
pg_dump -t x2 | sed 's/x2/x3/g' | psql
,在此设置下,我无权访问命令行 - 它在数据摄取之前创建索引,这很慢
- 它不能正确更新序列列作为证据
default nextval('x1_id_seq'::regclass)
- 它使用命令行选项
重置postgres表的序列值的方法:很好,但是很不幸,它非常手工。