我的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(...);
中答案 0 :(得分: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