问题的根源
与旧序列的连接来自相关列的普通默认值。我引用手册在这里:
复制的列定义的默认表达式将仅是
复制如果INCLUDING DEFAULTS
已指定。默认行为是
排除默认表达式,导致复制的列
新表的默认值为空。
由于您使用以下命令创建新表
INCLUDING ALL
And:
INCLUDING ALL
是一个缩写形式INCLUDING DEFAULTS INCLUDING
CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS
.
..你会得到相同的默认值。您可以排除默认值或显式更改默认值,包括nextval()
创建新表后。我不认为有任何中间立场。
使用转储/破解转储/恢复更简单
甚至是另一种复制整个模式的可靠方法
您可以转储模式的模式(相同的单词,不同的含义)pg_dump
:
pg_dump $DB -p $PORT -n $SCHEMA -sf /var/lib/postgresql/your_name.pgsql
破解转储(意思是:使用文本编辑器对其进行编辑,或编写脚本):交换转储顶部的模式名称以及所有其他出现的内容SET search_path
以及作为序列的模式限定以及可能更多。如果您选择了一个独特的名字对于架构,只需运行一次全局搜索并用您最喜欢的工具替换(sed
or vim
或...)应该完成这项工作。
然后运行 SQL 脚本psql
针对相同或任何其他数据库:
psql $DB -p $PORT -f /var/lib/postgresql/your_name.pgsql > /dev/null
与我第一次发布的相反,串行列在转储中仍然被分割(至少在 PostgreSQL 9.1.5 中)。 SQL 脚本单独创建序列,并将它们附加到序列列:
ALTER SEQUENCE seq OWNED BY tbl.col;
并单独设置默认值。
顺便说一句:当前版本的 pgAdmin 逆向工程serial
当满足所有要求时,DDL 脚本中的列。