Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用新的主键值还原PostgreSQL转储_Postgresql - Fatal编程技术网

使用新的主键值还原PostgreSQL转储

使用新的主键值还原PostgreSQL转储,postgresql,Postgresql,我遇到了PostgreSQL转储/还原问题。我们有一个运行PostgresSQL 8.4的生产应用程序。我需要在测试环境中的数据库中创建一些值,然后将这部分数据导入到生产环境中。数据是由应用程序生成的,我需要使用这种方法,因为它需要在投入生产之前进行测试 既然我描述了环境,我的问题是: 在测试数据库中,我只留下需要移动到生产数据库的数据。数据分布在多个表中,这些表与具有多个级别(如树)的外键链接。然后我使用pg_dump将所需的表导出为二进制格式 当我尝试导入时,数据库将正确导入具有新主键值的根

我遇到了PostgreSQL转储/还原问题。我们有一个运行PostgresSQL 8.4的生产应用程序。我需要在测试环境中的数据库中创建一些值,然后将这部分数据导入到生产环境中。数据是由应用程序生成的,我需要使用这种方法,因为它需要在投入生产之前进行测试

既然我描述了环境,我的问题是:

在测试数据库中,我只留下需要移动到生产数据库的数据。数据分布在多个表中,这些表与具有多个级别(如树)的外键链接。然后我使用pg_dump将所需的表导出为二进制格式

当我尝试导入时,数据库将正确导入具有新主键值的根表条目,但不会从其他表导入任何数据。我认为问题在于子表上的外键不再识别新的主键

是否有一种方法可以实现这样的导入,即更新树中所有受影响表的所有主键值,以自动更正串行(自动递增)值,并根据这些新主键值更新所有外键

在连接到两个数据库时,我已经知道如何借助编程语言来实现这一点,但这对我来说是非常困难的,因为我无法直接访问客户的生产服务器


提前谢谢

在我看来,这是一个复杂的迁移问题。您可以使用INSERT创建PL/pgSQL迁移脚本,使用returning获取序列,并将其用作树上其他表的外键。我不知道树的结构,但在某些情况下,由于复杂性或性能原因,可能需要提前将序列值读取到数组中


另一种方法是检查生产序列值,并估计在不久的将来不会使用的序列值。在测试环境中制作测试数据,使其具有不会与生产序列值冲突的序列值。然后将该数据加载到prod数据库中,并调整prod环境的序列值,以便不使用测试序列值。它将在您的ID序列中留下一个间隙,因此您必须检查是否有任何东西(像其他进程一样)依赖于序列值才能连续。

感谢您的快速回答!差距可能是一个问题,因为客户在发票、报价等中使用各种记录的ID。但我将研究PL/pgSQL语言。我对它不是很有经验,但我知道我能用它做些什么。你的测试数据将占用序列值,所以无论如何都要准备好有间隙。当然,您可以删除测试数据和修改序列,但是如果用户在测试时间段内使用生产环境,您就不能这样做,因为您的数据库将变得混乱。数据库工具可以将数据导出为insert语句,insert语句可以作为导出数据的起点。您可以使用INSERT INTO table(cols)VALUES(VAL)返回idcolumn来获取ID的值。您还可以将INSERT与子选择一起使用。INSERT WITH也是一个方便的工具。祝你好运:)谢谢你的建议,彼得。实际上,我提出了另一种可能性——它可以创建小间隙,但我有更多的控制权——我创建了一个脚本,该脚本将生产环境中所有受影响表中的序列按我希望插入的行数提前,+一些小保留。然后,我生成了要插入的数据,并在生产“gap”开始时以起始顺序插入,然后简单地插入:-)。此解决方案有效,所产生的差距最小。我接受了你的回答,因为这个想法是从中产生的。谢谢