有没有办法比较两个创建表查询并通过添加新列来更改现有表?



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

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

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将添加到现有表中。

您应该能够通过查看元数据表中的表定义来执行此操作 (information_schema)。

  1. 您始终可以使用保存元数据的information_schema数据库查看现有架构。
  2. 然后,您可以将新架构
  3. 导入临时数据库,根据新架构创建所有表,然后再次查看元数据。
  4. 也许能够在存储过程中使用动态 sql在运行时执行根据该差异创建的alter table语句

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

编辑 1

如果您无法从新架构创建临时数据库,则必须找到其他方法从中提取信息。我怀疑你有一个sql脚本,其中包含(除其他外)一堆CREATE TABLE ...语句,因为这通常是mysqldump创建的内容。因此,您必须解析此脚本。同样,这在javascript中似乎更容易,如果在MySQL存储过程中甚至可以的话。如果您的架构与您的示例一样结构良好,则它实际上只是几行代码。

编辑 2

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

相关内容

  • 没有找到相关文章

最新更新