【问题标题】:Importing New Database into Old Database, How to Retain Values of Old Database [PHPMyAdmin]将新数据库导入旧数据库,如何保留旧数据库的值 [PHPMyAdmin]
【发布时间】:2018-04-14 20:37:13
【问题描述】:

抱歉,可能是一个基本问题,但我真的尝试过自己的研究,但我什至找不到这个问题的正确语法,所以我没有找到解决方案。

我在一个在线系统中有一个包含许多表、列、行等的数据库。我已经离线对系统进行了大规模更新,并准备在本周上线。但是,由于系统中的新功能,一些表格已经改变,一些新表格已经添加等等。

我的问题是:我可以用大量更改的表更新我的数据库,但不删除它以前的信息吗?例如:假设我在旧系统中有一个名为 Users 的表,它跟踪用户名和密码。但是我已经更新了系统,现在用户表跟踪用户名、密码、姓名、年龄、出生日期、积分……无论如何,比以前更多的信息。

我想要发生的是更新表(和整个数据库),以便出现新的列和表等,但我不会丢失上一次迭代的信息。所以我不必为用户重新输入密码/用户名等。

当我搜索这个问题时,我得到的只是答案说我可以手动输入新的表/列,或者错误地认为我在询问值的串联,但这不是我的意图。

理想情况下,我希望将新数据库导入旧数据库。

非常感谢任何帮助。

【问题讨论】:

  • 您的新数据库中有数据吗?
  • 是的,实际上我必须保留它,因为它包含敏感/加密信息。
  • 当我写“新数据库”时,我并不是指您当前在线的系统。
  • 是的,我知道了,答案仍然是肯定的。
  • 那么您在生产和开发数据库中都有有价值的数据?

标签: mysql database phpmyadmin


【解决方案1】:

首先,我强烈建议您制作生产数据的备份副本并随身携带。在开发数据集成时,您将多次恢复它以回到“原始”状态。

将备份副本还原到本地 MySQL 服务器实例上的不同数据库。在学习如何进行数据集成时,您将需要进行大量测试,其中一些测试将具有破坏性。

该过程将针对您的本地生产数据库副本运行一系列脚本更改,然后查看它是否按照您希望的方式运行。如果没有,请删除并恢复生产数据库的本地副本,更正数据集成步骤中的任何错误,然后重试。这可能需要几天时间才能正确处理,并且需要多次重复执行。

所以你有两个任务:

  1. 升级生产数据库的表结构以匹配本地更改的数据库。您可以使用ALTER TABLE 进行许多此类更改。

    这是一项复杂的任务,因为很难分析两个不同的表并找出将一个表升级为另一个表所需的最小 ALTER TABLE 语句集。 MySQL 实用程序之一可以帮助解决这个问题:mysqldiff。您可以使用它来生成所需的 ALTER TABLE 语句。

  2. 将您的本地数据同步到生产数据库。这很复杂,因为您有一些数据应该部分覆盖现有的生产数据。您应该学习如何使用REPLACEINSERT...ON DUPLICATE KEY UPDATE

    请参阅我对“INSERT IGNORE” vs “INSERT … ON DUPLICATE KEY UPDATE” 的回答,了解一些有用的解释。

    您还可以执行 UPDATE 语句来连接来自不同数据库的表。当您想根据某个列中的公共值替换数据但该列不是唯一的,因此您不能使用 REPLACE 时,这将很有帮助。

这将是一个艰难而细致的过程。大多数专业软件开发项目都在为此苦苦挣扎。他们必须非常小心地编写对表的每一次更改的脚本,并且他们使用“模式迁移”工具将增量更改按顺序应用于任何数据库,因此可以将目标数据库升级到任何修订版。

但是,在开发过程中完成了一堆增量更改之后,试图找出所有这些增量更改,就像尝试拆开蛋糕一样。

【讨论】:

    【解决方案2】:

    由于您运行的是 mysql 服务器,您只需编写一个查询来导入数据。

    CREATE TABLE [dbo].[oldTable](
        [Pass] [varchar](50) NULL,
        [Username] [varchar](50) NULL
    ) ON [PRIMARY]
    
    Insert into oldTable (Pass,Username)
    Select 'pass', 'user'
    
    CREATE TABLE [dbo].[newTable](
        [Pass] [varchar](50) NULL,
        [Username] [varchar](50) NULL,
        [OtherColumn] [varchar](50) NULL
    ) ON [PRIMARY]
    
    Insert into newTable (Pass,Username)
    Select 'pass2', 'user2'
    

    【讨论】:

    • 此答案使用 Microsoft SQL Server 语法,尽管承认 OP 使用的是 MySQL。 Microsoft 用户不了解存在其他数据库产品或其他产品具有不同语法的情况确实很常见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多