如何将某些表从一个模式复制到 Postgres 中同一数据库中的另一个表并保持原始模式?

问题描述 投票:0回答:6

我只想将 Postgres 中同一数据库内的 4 个表从 schema1 复制到 schema2。并且希望将表保留在 schema1 中。知道如何在 pgadmin 以及 postgres 控制台中执行此操作吗?

postgresql pgadmin
6个回答
130
投票

您可以使用

create table ... like

create table schema2.the_table (like schema1.the_table including all);

然后将数据从源插入到目的地:

insert into schema2.the_table
select * 
from schema1.the_table;

50
投票

您可以使用 CREATE TABLE AS SELECT。这样就不需要插入了。将使用数据创建表格。

CREATE TABLE schema2.the_table
AS 
SELECT * FROM schema1.the_table;

6
投票

从 v12 开始使用的简单语法:

CREATE TABLE newSchema.newTable
AS TABLE oldSchema.oldTable;

1
投票

PG转储和PG恢复通常是最有效的工具。

从命令行:

pg_dump --dbname=mydb --schema=my_schema --file=/Users/my/file.dump --format=c --username=user --host=myhost --port=5432
pg_restore --dbname=mydb --schema=my_schema --format=c --username=user --host=myhost --port=5432 /Users/my/file.dump --no-owner

0
投票

这将循环遍历旧模式中的所有表,并使用新模式中的数据(无约束、索引等)重新创建它们。

-- Set the search path to the target schema
SET search_path = newSchema;

-- Loop over the table names and recreate the tables
DO $$
DECLARE
  table_name text;
BEGIN
  FOR table_name IN
    SELECT t.table_name
    FROM information_schema.tables t
    WHERE t.table_schema = 'public'
      AND t.table_type = 'BASE TABLE'
  LOOP
    EXECUTE 'CREATE TABLE ' || quote_ident(table_name) || ' AS TABLE oldSchema.' || quote_ident(table_name);
  END LOOP;
END $$;

当您不需要附加到表的所有额外内容而只需要完整数据的干净副本时,这对于折叠数据仓库的多个模式特别有用。


0
投票

如果您使用 PGAdmin:

  1. 选择要复制的表,选择 SQL 选项卡并复制
    CREATE
    脚本,其中包括所有键和约束
  2. 在表名前添加所需的schema并执行。
  3. 执行
    INSERT INTO schema2.the_table SELECT * FROM schema1.the_table;
    。在这里您可能会遇到错误
    column "your_column" is of type XX but expression is of type YY
    。在本例中,我已指定所有列:
    INSERT INTO schema2.the_table (fieldq, field2, ...fieldN) SELECT fieldq, field2, ...fieldN FROM schema1.the_table;
© www.soinside.com 2019 - 2024. All rights reserved.