我知道我可以做CREATE TABLE tbl_2 AS (select * from tbl_1)
但有更好/更快/更强的方法吗?我说的是性能而不是其他任何东西。这些表都是非规范化的,我没有任何外键约束需要担心。
修改的
可能没有更好的方法吗?参考:https://dba.stackexchange.com/questions/55661/how-to-duplicate-huge-postgres-table
答案 0 :(得分:1)
更好的方法实际上取决于你希望完成的目标。
如果要保留原始表中的所有约束和索引,可以使用LIKE
语句中的CREATE TABLE
子句,如下所示:
CREATE TABLE tbl_2 (LIKE tbl_1 INCLUDING INDEXES INCLUDING CONSTRAINTS);
但这只会创建一个空表。您仍然需要复制数据。
答案 1 :(得分:0)
或者,您可以使用以下内容:
$ pg_dump -t tbl_1 | sed -e 's/^SET search_path = .*$/SET search_path = tmpschema, pg_catalog;' > table.sql
$ psql -d test -c 'CREATE SCHEMA tmpschema'
$ psql -1 -d test -f table.sql
$ psql -d test -c 'ALTER TABLE tmpschema.tbl_1 RENAME TO tbl_2; ALTER TABLE tmpschema.tbl_2 SET SCHEMA public; DROP SCHEMA tmpschema'
也许它不比CREATE TABLE ... AS (SELECT ...)
快,但它也会复制所有索引和约束。