0

我正在将 MySQL 数据库移植到 PostgreSQL。到目前为止,我已经设法重建所有表和列并导入数据。但是,自动递增的唯一id字段尚未正确转换。我使用pgAdmin GUI更正了表中的一列。我想我可能不是第一个从 MySQL 转换到 Postgres 的人,所以可能有一种强大且经过测试的方法可以将其作为一项自动化任务来完成。如果有人能提供这么小的脚本,我将不胜感激。

但是,我想要一个经过测试的解决方案的主要原因是,我在添加序列并为相关列设置默认值后遇到了问题。序列的当前值已正确设置2069为最后一个表条目的值。当我运行我的程序并添加一行时,我得到了一个异常,它说2069已经分配了唯一值。当我再次运行程序时,它创建了新行,但自动递增的 id 是2071. 它跳过了2070

所以现在有3个可能的错误来源:

  • PostgreSQL 9.5 中的错误
  • Java JDBC 连接器中的错误
  • 我在自动增量字段和序列上犯了一个错误。

通过使用经过测试的解决方案,我可以消除最后一种可能性。

4

1 回答 1

1

老问题,但无论如何。我在这里有同样的“问题”。

在应用程序 dbMigration.NET ( http://fishcodelib.com/DBMigration.htm )的帮助下,我已将数据库从 MySQL 迁移到 PostgreSQL 。

检查结果后,我发现有时序列没有正确的“最后一个值”。例如,它会以 1 开头而不是 id 2976。在这种情况下,下一个值应该是 2。

在我的旧数据库中,一些行被删除了,所以如果我(和你做航海一样)再次保存应用程序 postgresql 正在尝试保存下一个值。如果此 ID 为“免费”,则保存成功。也许这对你来说也是一样的。这不是错误或其他东西。

结果......序列必须设置为正确的,当前表的最后一个值。对每个序列执行以下查询:

SELECT SETVAL('testtable_id_seq', (select max(id) from testtable));

或者,如果 sequencename 未知:

SELECT SETVAL(pg_get_serial_sequence('testtable', 'id'), (SELECT max(id) FROM testtable));

希望我没有误解你的问题。但也许这对其他有同样“问题”的人有帮助。

于 2017-07-14T07:34:06.720 回答