首页 > 解决方案 > 有没有办法比较两个创建表查询并通过添加新列来更改现有表?

问题描述

所以在这种情况下,我将多次获取整个数据库模式。但每次表结构可能与前一个略有不同。由于我里面已经有数据,有没有办法编写查询来与现有表进行比较并添加新列?

例如,我的数据库中已经有这个表。

CREATE TABLE `Ages` ( `AgeID` int(11) DEFAULT NULL, `AgeName` varchar(32) DEFAULT NULL, `AgeAbbreviation` varchar(13) DEFAULT NULL, `YouthAge` varchar(15) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

在我得到的新模式中,有相同的表但有不同的列。 CREATE TABLE `Ages` ( `AgeID` int(11) DEFAULT NULL, `AgeName` varchar(32) DEFAULT NULL, `AgeAbbreviation` varchar(13) DEFAULT NULL, `YouthAge` varchar(15) DEFAULT NULL, `AgeLimit` varchar(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

在这种情况下,该列AgeLimit将添加到现有表中。

标签: mysql

解决方案


  1. 您始终可以使用information_schema包含元数据的数据库查看现有模式。
  2. 然后,您可以将新模式导入临时数据库,根据新模式创建所有表,然后再次查看元数据。
  3. 您可能能够在存储过程中使用动态 sqlalter table来执行在运行时从该差异创建的语句

但我认为,这从后端 nodejs 服务器要容易得多,因为您也可以从 nodejs 轻松执行第 1 步和第 2 步(实际上只是查询一堆表),并且您有更多的可能性来计算差异,创建并执行适当的查询。

编辑 1

如果您没有从新模式创建临时数据库的可能性,则必须找到其他方法来从中提取信息。我怀疑您有一个带有(以及其他)一堆CREATE TABLE ...语句的 sql 脚本,因为这通常是mysqldump创建的。所以你必须解析这个脚本。同样,这在 javascript 中似乎更容易,即使在 MySQL 存储过程中也是可能的。如果您的架构与您的示例一样结构化,那么它实际上只是几行代码。

编辑 2

也许您可以从这里获得一些灵感:比较两个 MySQL 数据库 提到了一些在数据库之间进行同步的工具。


推荐阅读