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

标签 mysql sql postgresql pgadmin

我正在尝试使用 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/

相关文章:

sql - Oracle sql查询查找具有特殊字符作为值的列

sql - 不要根据联合查询中的列选择重复项

sql - 如何修复 AWS Athena 的 SQL

sql - 将不匹配的 ID 插入列的更快方法

postgresql - 将逻辑模型转换为物理模型。难以理解 ERD

javascript - iFrame Widget 获取 URL 和 IP 地址

mysql - 在 php mysql_fetch_array() 和 mysql_fetch_row() 中不在同一个变量上工作

php - 密码哈希 API 查询

mysql - 无法远程连接容器中的mysql服务器

sql - 无法调试 MS Access 2013 运行时错误 91