gpt4 book ai didi

mysql - 使用外键约束从 SQL 脚本还原数据库

转载 作者:行者123 更新时间:2023-11-29 14:12:37 26 4
gpt4 key购买 nike

我正在尝试使用 SQL 脚本恢复数据库,但外键约束妨碍了工作

我正在使用一个 MySQL 数据库并将其移植到 PostgreSQL。由于 MySQL 创建表的语法最终完全不同,我使用了另一个具有相同架构但不同数据的 PostgreSQL 数据库,并仅从中恢复了架构。换句话说,我现在有一个数据库,其中包含表、约束、序列和所有这些东西,但里面没有数据。

因此,是时候恢复数据了。我使用 phpMyAdmin(仅数据)将 MySQL DB 备份为 SQL 脚本(pgAdmin 由于某种原因似乎不接受 zip 或 gzip 文件)并运行 SQL 脚本。现在,这就是问题开始发生的地方,这是很自然的,我要从 MySQL 转到 PostgreSQL,所以语法错误肯定会发生。

但是,还有其他与语法无关的问题,比如这个:

ERROR: insert or update on table "_account" violates foreign key constraint "fk_1_account"
DETAIL: Key (accountid)=(2) is not present in table "_entity".

所以,是的,基本上,存在外部约束,查询试图将数据插入到 _account 表中,但相应的数据尚未插入到 _entity 表呢。我该如何解决这个问题?有没有办法让 pgAdmin3/PostgreSQL 禁用所有约束,插入数据,然后重新启用约束?

我遇到的一个与语法相关的错误,是这个:

 INSERT INTO _accounttype_seq (id) VALUES (11);

该语句的 PostgreSQL 等价物(如果我是正确的话)是

 ALTER SEQUENCE _accounttype_seq INCREMENT BY 11; 

但是,运行整个脚本并更改所有 200 多个序列插入语句有点痛苦。所以,我在这里偷懒了,但是有没有更简单的方法来处理序列?

或者,你们对一组不同的工具有什么建议可以使这更容易吗?

感谢您的宝贵时间,祝您有美好的一天。

最佳答案

不要试图绕过外键约束。这是确保数据是坏的方法。

首先查看约束并确保以正确的顺序插入到表中。如果 _entity 是“_account 的父级,则应首先填充它。

接下来,您需要让脚本将任何失败的记录移动到异常表中。然后您可以查看它们并查看数据完整性问题是什么,以及您是否需要永久丢弃记录或尝试找出丢失的父值应该是什么。如果它是关键数据,例如客户不再存在的订单(可能在没有正确 fks 的任何系统中开始)并且您必须保留记录并且无法确定父值应该是什么,您可以创建客户表中的“未知”记录,并将所有不良订单分配给该客户 ID。

手动更改更改序列应该不会花很长时间,即使它很无聊。在这种类型的转换中,您还需要手动处理很多其他事情。

我会尝试为 PostgreSQL 找到一个数据导入工具 - 我住在 SQL 服务器世界,在那里我会使用 SSIS,但你需要 PostgreSQL 世界的 SSIS 等价物。

关于mysql - 使用外键约束从 SQL 脚本还原数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7970025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com