复制Postgres表并保持主键自增

6
我正在尝试使用这个Postgres命令复制一个表,但是主键自动增量特性没有被复制。有没有快速简单的方法来完成这个任务?谢谢!
CREATE TABLE table2 AS TABLE table;

2
PostgreSQL中不存在此命令。您使用的命令的确切文本是什么?您使用的PostgreSQL版本/发行版是什么?是否使用了EnterpriseDB的Postgres Plus之类的变体?最接近的Pg等效方法是使用CREATE TABLE ... LIKE,然后是COPY和任何必需的setval语句来设置序列。 - Craig Ringer
谢谢,我最终创建了一个具有相同模式/设置的表,然后将所有值复制到新表中。 - sheldonk
如果想避免使用临时文件,可以将我的上面的评论中的 COPY 替换为 INSERT INTO ... SELECT。我当时没有考虑到这一点。 - Craig Ringer
这就是我所做的,但结果发现它没有更新自增键。当我试图向重复表中插入更多行时,我收到了一个错误,说我不能有重复的主键,因为它试图从1开始递增。 - sheldonk
1
是的,您必须执行以下操作:BEGIN; LOCK TABLE thetable; SELECT setval('the_seq_name', (SELECT max(id) FROM thetable)+1); COMMIT; - Craig Ringer
1个回答

9

以下是我的做法:

BEGIN;
LOCK TABLE oldtable; 
CREATE TABLE newtable (LIKE oldtable INCLUDING ALL);
INSERT INTO newtable SELECT * FROM oldtable;
SELECT setval('the_seq_name', (SELECT max(id) FROM oldtable)+1);
COMMIT;

虽然这是一件相对不常见的事情,但我对您想要解决的问题很感兴趣。


我正在构建工具来弥补PostgreSQL无法不过于复杂的缺点。如果使用构建工具失败,我可以使用我的表复制工具快速复制现有表并快速重试另一个PostgreSQL工具的执行,而不是通过复制粘贴恢复数据库目录。我可以使用控制台,但这样每次都需要构造查询(除了向上键),当GUI被有效地构建时,GUI更优于快速完成任务。感谢分享您的答案。 - John
1
这个对我有用。我将旧表转储为 CSV,然后使用 \copy ... 命令将 CSV 从本地加载到 RDS 实例中。在进行复制时,我包括了行的原始 id,但新表的序列计数器从0开始。 - nemo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接