我正在创建一个 PHP脚本来比较两个数据库的模式.

我已经设法检查关于丢弃/添加的表,列,索引和引用的模式更改,但是当涉及重命名的列时,我有点卡住了.

在以下示例中,源数据库包含最新的模式,目标数据库包含类似的模式,但可能已过期.

先决条件:

>我不知道自上次差异以来发生的变化.
>数据库中的数据将不匹配,但模式应该在diff之后.

以目标数据库中的以下模式为例.

Field   Type    Null    Key Default Extra
field1  int(11) NO      NULL     
field2  int(11) NO      NULL     
field3  int(11) NO      NULL

然后在源数据库中假设以下模式.

Field   Type    Null    Key Default Extra
field1  int(11) NO      NULL     
field4  int(11) NO      NULL     
field3  int(11) NO      NULL

没有明确地知道发生了什么,我无法确定field2是否通过DROP,ADD AFTER或CHANGE COLUMN更改为field4.以下两个查询在表结构方面实现了相同的结果,但是使用前者丢失了数据.

(1)    ALTER TABLE `demo` DROP `field2`
       ALTER TABLE `demo` ADD `field4` INT( 11 ) NOT NULL AFTER `field1` 

(2)    ALTER TABLE `demo` CHANGE `field2` `field4` INT( 11 ) NOT NULL

我可以明显地删除旧的列名称并创建一个新的名称,然后丢失原始列中的任何数据.我需要使用ALTER TABLE表CHANGE COLUMN字段new_name结构;查询而不是DROP列FROM表,后跟ALTER TABLE表
ADD列定义;

我希望我可以使用DDL触发器跟踪模式中的更改,并将这些更改的记录插入到源数据库中的表中.我可以稍后查询这个表来确定一列如何.但是,据我所知,不可能在MysqL中运行DDL查询的触发器,它排除了记录这些更改.我读过MysqL Forge的这个工作日志(WL#2418: DDL Triggers)(现在位于MysqL开发者专区),但似乎还在等待实现.

有没有一种方法可以更新表以匹配关于重命名列而不丢失数据的模式?

我已经看过像MySQLDiff这样的东西,但它需要被构建成一个现有的代码,所以我不得不自己构建它.

我认为的想法

>为每个列添加一个注释,该列是一个唯一的数字或字符串(为了参数调用一个哈希).查询information_schema表以检索该值并在每列上进行比较.如果它是唯一的,那么它是一个新的列,或者如果它匹配一个哈希,而不是一个名称或结构,那么它被重命名/重新配置.
>比较模式,如果有一个新的列 – 检查它是相对于相邻列的位置.如果新列的名称与缺少的名称相同,则该列的结构将与该列的结构进行比较.如果它匹配,请考虑重命名.如果没有,考虑删除然后添加.

我不认为你应该以这种方式同步架构.您应该每次更改任何内容时检查迁移脚本到源代码,然后在数据库中记录应用了哪些迁移的表.这样,您可以确保所有迁移都应用于所有数据库.例如`
CREATE TABLE `ddl_version` (
version` varchar(32)  NOT NULL,`applied_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,UNIQUE KEY `version` (`version`)

)`

php – MySQL DDL触发器,用于列重命名的Diff表架构的更多相关文章

  1. 详解前端HTML5几种存储方式的总结

    本篇文章主要介绍了前端HTML5几种存储方式的总结 ,主要包括本地存储localstorage,本地存储sessionstorage,离线缓存(application cache),Web SQL,IndexedDB。有兴趣的可以了解一下。

  2. PhoneGap / iOS上的SQLite数据库 – 超过5mb可能

    我误解了什么吗?Phonegap中的sqlitedbs真的有5mb的限制吗?我正在使用Phonegap1.2和iOS5.解决方法您可以使用带有phonegap插件的原生sqliteDB,您将没有任何限制.在iOS5.1中,Websql被认为是可以随时删除的临时数据…

  3. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

  4. ios – 领域:如何获取数据库的当前大小

    是否有RealmAPI方法使用RealmSwift作为数据存储来获取我的RealmSwift应用程序的当前数据库大小?

  5. ios – Realm – 无法使用现有主键值创建对象

    我有一个对象有许多狗的人.应用程序有单独的页面,它只显示狗和其他页面显示人的狗我的模型如下我有人存储在Realm中.人有详细页面,我们取,并显示他的狗.如果狗已经存在,我会更新该狗的最新信息并将其添加到人的狗列表中,否则创建新狗,保存并将其添加到人员列表中.这适用于coredata.在尝试用他的狗更新人时,领域会抛出异常无法使用现有主键值创建对象解决方法这里的问题是,即使你正在创建一个全新的Rea

  6. ios – 重命名Xcode项目后出现NSKeyedUnarchiver错误

    解决方法不要更改项目名称.只需更改显示名称即可.它是Info.plist中的“Bundledisplayname”条目.您可能需要添加条目.如果要更改OSX应用程序的显示名称,请参阅thisanswer.

  7. ios – UIWebView中的WebSQL / SQLite数据库的最大大小(phonegap)

    我知道一般来说,Web应用程序的本地存储空间有5MB的限制.本地网页浏览应用程式是否也有这个限制?

  8. ios – Firebase离线存储高级 – 手动同步和进度信息

    >我可以提供一个捆绑数据库–安装App后我可以已经离线查询了Firebase数据?然后我有另一个关于Firebase的主要问题:>JSON存储是伟大的–但是这样我们不关心一个独特的结构,我们必须注意这一点插入总是正确的数据集?我从来没有试图显示实际的进展,但是当您从firebase中检索数据时,始终会在成功检索数据时调用onDataChange方法.https://firebase.google.com/docs/database/android/retrieve-data#read_data_onceC

  9. ios – 如何处理多用户数据库

    我的应用程序就像很多应用程序–它有一个用户输入用户名和密码的登录屏幕,以及登录按钮我的应用程序还使用CoreData来保存大多数用户的业务对象,当然也是用户特定的.我也有一个登出按钮来启用切换用户.这不会发生很多,但仍然是必要的).现在如果不同的用户登录,我需要获取他的具体数据.但是我该如何做呢?

  10. 无法重命名Xcode 4中的组文件夹

    我今天在Xcode4中添加了一个新的组,其中包含几个文件.由于某种原因,这已经包含了一段时间,我无法命名或重命名组文件夹.以前有人发生过这种情况吗?解决方法你为了重命名而尝试做什么?上下文菜单不提供重命名选项.所以我也是>选择组>点击返回选择它进行编辑要么>选择组>短暂的延迟再次单击它

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部