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
将添加到现有表中。
解决方案
- 您始终可以使用
information_schema
包含元数据的数据库查看现有模式。 - 然后,您可以将新模式导入临时数据库,根据新模式创建所有表,然后再次查看元数据。
- 您可能能够在存储过程中使用动态 sql
alter table
来执行在运行时从该差异创建的语句
但我认为,这从后端 nodejs 服务器要容易得多,因为您也可以从 nodejs 轻松执行第 1 步和第 2 步(实际上只是查询一堆表),并且您有更多的可能性来计算差异,创建并执行适当的查询。
编辑 1
如果您没有从新模式创建临时数据库的可能性,则必须找到其他方法来从中提取信息。我怀疑您有一个带有(以及其他)一堆CREATE TABLE ...
语句的 sql 脚本,因为这通常是mysqldump
创建的。所以你必须解析这个脚本。同样,这在 javascript 中似乎更容易,即使在 MySQL 存储过程中也是可能的。如果您的架构与您的示例一样结构化,那么它实际上只是几行代码。
编辑 2
也许您可以从这里获得一些灵感:比较两个 MySQL 数据库 提到了一些在数据库之间进行同步的工具。
推荐阅读
- jquery - jQuery为悬停功能选择子项NO TAG
- asp.net-core - 如何使用相同的数据运行多个单元测试
- javascript - if/else 语句只记录 if,而不是 else
- c# - WCF 使用 BasicHttpBinding 证书通过 http 和 https 公开服务仍然在浏览器中显示 NotSecure
- angular - 在视图Angular4中显示对象
- git - 推送后在远程服务器上看不到我的代码
- r - 从数据库中的多个变量中删除数据框中的行
- sql - 执行 LENGTH(email_address) 后的 NULL 字段
- vala - 使用 Flatpak 在 vala 构建中使用 libsoup 发出获取请求
- android - 在 ListView 中显示两个项目,在 null 对象引用上获取 setAdapter()