我正在将一个MySQL数据库移植到PostgreSQL。到目前为止,我已经设法重建所有表和列并导入数据。但是,自动递增的唯一id
字段尚未正确转换。我使用 pgAdmin GUI 来更正表中的一列。我想我可能不是第一个从MySQL转换到Postgres的人,所以可能有一个强大且经过测试的方法来做这个自动化任务。如果有人能提供如此小的剧本,我将不胜感激。
然而,主要原因是,为什么我想要一个经过测试的解决方案是因为我在添加序列并设置相关列的默认值后遇到了问题。序列的当前值已正确设置为2069
,即最后一个表项的值。当我运行我的程序并添加一行时,我得到一个异常,表示已经分配了唯一值2069
。当我再次运行程序时,它创建了新行,但自动递增的id为2071
。它跳过2070
。
所以现在有3种可能的错误来源:
通过使用经过测试的解决方案,我可以消除最后的可能性。
答案 0 :(得分:0)
老问题但无论如何。我在这里有同样的“问题”。
我借助应用程序dbMigration.NET(http://fishcodelib.com/DBMigration.htm)将我的数据库从MySQL迁移到PostgreSQL。
检查结果后,我发现有时序列没有正确的“最后值”。例如,代替id 2976,它将从1开始。在这种情况下,Next值应为2。
在我的旧数据库中删除了一些行,所以如果我(和航海一样)再次保存应用程序,postgresql会尝试保存下一个值。如果此ID是“免费”,则保存成功完成。也许这对你来说也是如此。这不是错误或其他原因。
结果......序列必须设置为表的正确的当前最后一个值。对每个序列执行以下查询:
SELECT SETVAL('testtable_id_seq', (select max(id) from testtable));
或者,如果不知道sqeuencename:
SELECT SETVAL(pg_get_serial_sequence('testtable', 'id'), (SELECT max(id) FROM testtable));
希望我不会误解你的问题。但也许这对于其他具有相同“问题”的人有帮助。