【问题标题】:Copying records from mysql to pgsql with serial id field使用序列号字段将记录从 mysql 复制到 pgsql
【发布时间】:2020-09-14 17:56:34
【问题描述】:

我有一个基于 Web 的数据库应用程序,目前使用 mysql 数据库。我们正在从 mysql 移动到 pgsql,因此我们正在将数据从 mysql db 移动到新的 pgsql db。在数据中,一个表中有表头记录,另一个表中有明细记录。标题记录有一个用于记录 id 的序列字段,而详细记录有一个数字字段,用于保存标题记录 id 以将详细记录与标题记录联系起来。由于使用此数据的应用程序在创建记录时依赖数据库生成记录 ID,因此目标 pgsql 数据库中存在相同的结构。如何将数据从mysql数据库复制到pgsql数据库并维护header/detail id关系?似乎标头记录将获得其 id 的下一个序列化值,并且将添加详细记录,但仍保留旧的 mysql 标头记录 ID。

【问题讨论】:

  • 答案取决于您在 Postgres 中定义表的准确程度;不幸的是,您选择不提供这些重要信息。这些答案之一可能会对您有所帮助:12

标签: mysql postgresql data-migration


【解决方案1】:

Postgres 使用序列来跟踪自增主键。您可以按原样从 MySQL 插入主键和外键。然后,您将需要根据您的数据更新序列以具有 max(id)。

见:https://www.postgresql.org/docs/current/functions-sequence.html

例如:

SELECT setval('your_table_name_seq', select max(id) from your_table_name);

注意 setval 参数的“_seq”后缀。

【讨论】:

    【解决方案2】:
    class Employee(NamedTuple):  # inherit from typing.NamedTuple
        name: str
        id: int = 3  # default value
    
    employee = Employee('Guido')
    assert employee.id == 3
    

    【讨论】:

    • OP 为什么要试试这个好的答案将始终解释所做的工作以及这样做的原因,不仅适用于 OP,而且适用于 SO 的未来访问者,他们可能会发现这个问题并正在阅读您的答案。如果回答得很好,也许他们会支持它。
    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2020-05-20
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    相关资源
    最近更新 更多