pg_dump将约束的表模式转储为压缩

时间:2013-12-05 08:59:01

标签: postgresql postgresql-9.2

我的pg_dump返回约束是在转储文件末尾的alter query中。我希望那些在create table(...)部分中。

例如。我已经创建了一个带有约束的表:

CREATE TABLE "test_constraints" (
    "id" serial NOT NULL,
    "user_id" bigint NOT NULL,
    PRIMARY KEY ("id"),
    CONSTRAINT "user_id" UNIQUE ("user_id")
);

使用以下命令进行模式转储:

pg_dump.exe -U postgres -t "test_constraints" -f "D:\dump.sql" "postgres"

当我创建表架构时,它是否可以原样(或接近那个)?我的意思是约束需要在create table(...);

2 个答案:

答案 0 :(得分:4)

不,这是不可能的。事实上,事情就是这样做的。

问题是转储通常是为了批量加载,因此您希望在加载数据后创建索引。这实际上意味着您希望分三步完成此操作:

  1. 定义表格
  2. 加载数据
  3. 创建索引
  4. 现在的问题是某些约束是通过索引在内部处理的,因此需要在第3阶段创建它们。出于性能原因,您希望在批量加载后创建主键和唯一约束。

答案 1 :(得分:2)

我知道这是一个相当陈旧的问题,在大多数情况下我同意Chris的意见,这不是你真正想做的事情(因为除非按照确切的顺序恢复表,否则任何外键都会出现问题);然而,因为谷歌搜索我问的问题是一个相当高的结果,没有人实际上回答了问题本身,这可能有助于警告你可能不应该使用它,除非你知道你的'做... ...

这个bash脚本(我不会把它称为单行,因为它不是真的,虽然如果你只是将它粘贴到命令行就可以工作)从psql输出表列表(对于公共模式)并运行每个表分别通过pg_dump,然后将约束合并到主表定义中,将每个表结果输出到基于tablename命名的文件。

您还可以从架构表中选择SELECT以获取表名,而不是解析来自\ dt的输出;我认为这可能很难记住如何做另一个。

这是我对我的特定应用程序所需要的,我不保证它将适用于你的(或者确实适用于特定版本的pg_dump),但你不应该在修改它时遇到很多问题。肯定有更好的方法来完成第二部分(可能使用awk),但这很简单并完成了工作。除了表创建,约束和所有权之外,我忽略了所有内容;如果你想添加其他行,那么你需要在/ OWNER TO / line ...

中添加额外的测试
DB=mydb; s=1; psql -tA -F, -c '\dt public.*' $DB | cut -f2 -d, | while read t ; do 
  (
    rm -f "$t.sql2"; pg_dump -sx -t "$t" $DB | grep -v -e '^--' -e '^set' -i | while read a; do
      if [ $s -eq 1 ] ; then 
        if [ "a$a" = 'a);' ] ; then s=2 ; else echo $a ; fi; 
      elif [ $s -eq 2 ] ; then 
        b=$(echo $a | sed -e 's/\s*ADD CONSTRAINT\(.*\);/CONSTRAINT \1/')
        if [ "a$b" != "a$a" ] ; then 
          echo ",$b"
        elif [ "a$a" != "a${a/OWNER TO/}" ] ; then 
          echo $a >> "$t.sql2"
        fi
      fi
    done
    echo ");"
  ) > "$t.sql"
  if test -f "$t.sql2" ; then cat "$t.sql2" >> "$t.sql"; rm -f "$t.sql2"; fi
done