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

时间:2019-04-03 17:56:26

标签: mysql

因此,在这种情况下,我将多次获得整个数据库架构。但是每次表结构可能与前一个结构略有不同。既然我已经有数据了,有没有办法写一个查询与现有表进行比较,而只添加新列呢?

例如,我的数据库中已经有了该表。

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

2 个答案:

答案 0 :(得分:0)

您应该可以通过查看元数据表(information_schema)中的表定义来做到这一点。

答案 1 :(得分:0)

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

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

编辑1

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

编辑2

也许您可以从这里得到一些启发:Compare two MySQL databases提到了一些在数据库之间进行同步的工具。