Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎样才能测试一个SQL;“创建表格”;语句是否等效于现有表?_Sql_Mysql_Unit Testing - Fatal编程技术网

我怎样才能测试一个SQL;“创建表格”;语句是否等效于现有表?

我怎样才能测试一个SQL;“创建表格”;语句是否等效于现有表?,sql,mysql,unit-testing,Sql,Mysql,Unit Testing,对于MySQL数据库中的每个表,我都有一个mytablename.sql文件,其中包含该表的createtable语句 我想添加一个测试,以检查noone是否在不更新此文件的情况下在live数据库中添加/更改了列—我想检查我是否可以使用这些脚本重新创建空数据库 我怎样才能可靠地做到这一点 一个选项是使用mytable中的显示列(或描述mytable),在命令行上以如下表格形式输出: +---------+------------------+------+-----+--------------

对于MySQL数据库中的每个表,我都有一个
mytablename.sql
文件,其中包含该表的
createtable
语句

我想添加一个测试,以检查noone是否在不更新此文件的情况下在live数据库中添加/更改了列—我想检查我是否可以使用这些脚本重新创建空数据库

我怎样才能可靠地做到这一点

一个选项是使用mytable中的
显示列(或
描述mytable
),在命令行上以如下表格形式输出:

+---------+------------------+------+-----+---------------------+----------------+
| Field   | Type             | Null | Key | Default             | Extra          |
+---------+------------------+------+-----+---------------------+----------------+
| pk_guid | int(10) unsigned | NO   | PRI | NULL                | auto_increment | 
| d_start | datetime         | NO   | MUL | 0000-00-00 00:00:00 |                | 
| d_end   | datetime         | NO   | MUL | 0000-00-00 00:00:00 |                | 
+---------+------------------+------+-----+---------------------+----------------+
然后创建一个临时表并比较结果

这很好,只是如果有任何列被添加到live数据库中,那么结果的行顺序可能不同

不幸的是,似乎不可能将
orderby
SHOW COLUMNS
一起使用

另一个选项是使用
showcreatetable
,但其中包括诸如
AUTO_INCREMENT
计数器值之类的信息,我不关心这些信息

有更好的方法吗?

您写道:

一个选项是使用
显示列
。。。在命令行上。。。。 [但列]的行顺序可能不同

你可以在事后强制执行这个命令。在UNIX ish系统上,您可以简单地:

$ mysql -Bse 'SHOW COLUMNS FROM possibly_altered' | sort

并将其与您的
.sql
文件生成的临时表上类似的经过整理和排序的
SHOW
输出进行比较。(Bs
-Bs抑制了一些mysql(1)奇特的格式和标题,对于更具编程性的比较来说,这是不必要的,也有点不方便。)

过去我在数据库服务器(开发/生产设置)中使用了一个比较贫民区/管道磁带PHP shell脚本。假设您有两台服务器,其中一台是“正确的”:

  • 获取每个表的列列表以进行检查<如果您对可能更改的数据类型/默认值不感兴趣,可以使用代码>显示创建表工作,或者选择x限制1中的*
  • array_sort()按字母顺序排列字段名称,并循环遍历每个字段,比较您感兴趣的任何潜在更改
不推荐这个!我之所以使用它,是因为系统管理员根本不想向一些外包人员授予完全的db权限,所以它只是一个快速的安全网,没有计划好的或永久的单元测试



一种更优雅、更简洁的方法(仅限于MySQL5+)是使用
information\u schema
系统数据库,尤其是
COLUMNS
表。如果您没有两台服务器,那么保存/复制列信息的单独数据库(例如,具有最新“正确”模式的信息模式的克隆)也可以工作。这将使您能够区分新的/删除的表、索引、触发器、过程、用户/权限等。

我认为SHOW CREATE TABLE是您所能获得的最佳选择。谁在乎是否有额外的信息,你可以很容易地切断它。