Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
Mysql 找出两个版本的数据库中哪些表不同_Mysql_Database_Database Schema_Information Schema - Fatal编程技术网

Mysql 找出两个版本的数据库中哪些表不同

Mysql 找出两个版本的数据库中哪些表不同,mysql,database,database-schema,information-schema,Mysql,Database,Database Schema,Information Schema,我有两个版本的数据库(比如说db\u dev和db\u beta)。我在数据库中做了一些更改—添加了一些表,并更改了一些现有表中的一些列。我需要找出进行了更改的表名列表 通过在信息\u模式数据库上运行以下查询,我可以轻松找到我添加的表: SELECT table_name FROM tables WHERE table_schema = 'db_dev' AND table_name NOT IN (SELECT table_name

我有两个版本的数据库(比如说
db\u dev
db\u beta
)。我在数据库中做了一些更改—添加了一些表,并更改了一些现有表中的一些列。我需要找出进行了更改的表名列表

通过在
信息\u模式
数据库上运行以下查询,我可以轻松找到我添加的表:

SELECT table_name
FROM   tables
WHERE  table_schema = 'db_dev'
       AND table_name NOT IN (SELECT table_name
                              FROM   tables
                              WHERE  table_schema = 'db_beta');

如何获取在两个数据库版本中其
列名称
s不匹配的
表名称
s?

以下解决方案不像您尝试过的那样使用sql查询,也没有提供表的真实列表,但它显示了两个数据库中的所有更改

您可以对这两种数据库结构执行以下操作:

mysqldump -u root -p --no-data dbname > schema.sql

然后,您可以比较这两个文件,例如使用
diff
linux工具。

以下解决方案不像您尝试的那样使用sql查询,也不会提供真正的表列表,但它会显示两个数据库中的所有更改

您可以对这两种数据库结构执行以下操作:

mysqldump -u root -p --no-data dbname > schema.sql

然后,您可以比较这两个文件,例如使用
diff
linux工具。

有许多现成的工具,可以通过比较两个数据库为您提供更改的模式。以下是一些可以满足您需要的工具:


红门的MySQL比较是实现这一目的的最佳工具。虽然是付费的,但是如果你想做一些临时的事情,他们会提供14天的免费试用版

有许多现成的工具,可以通过比较两个数据库来提供更改的模式。以下是一些可以满足您需要的工具:


红门的MySQL比较是实现这一目的的最佳工具。虽然是付费的,但是如果你想做一些临时的事情,他们会提供14天的免费试用版

使用
信息\u模式
,下面是它的工作原理

首先,您知道
information\u schema.COLUMNS
表包含列定义。如果一列已更改,或某个表不存在,则它将反映在
信息\u schema.COLUMNS
表中

困难的部分是您必须比较
columns
表中的所有列。因此,您必须选择
TABLE\u CATALOG、TABLE\u NAME、COLUMN\u NAME、ORDINAL\u POSITION、COLUMN\u DEFAULT、
等等(这取决于您的MySQL版本)。 列列表是以下查询的结果:

  SELECT GROUP_CONCAT(column_name)
  FROM information_schema.COLUMNS
  WHERE table_schema="information_schema"
       AND table_name="COLUMNS" AND column_name!='TABLE_SCHEMA';
在这之后,我们只需选择表名,并搜索出现一次的列(其他表中不存在列),或者有两个不同定义的列(更改列)。因此,我们将在结果查询中有两个不同的计数来考虑这两种情况。

因此,我们将使用一个准备好的语句来检索所需列的列表,并对结果进行分组

生成的查询将为您完成以下所有过程:

 SELECT CONCAT(
      "SELECT DISTINCT TABLE_NAME
           FROM information_schema.COLUMNS
           WHERE TABLE_SCHEMA IN('db_dev', 'db_beta')
           GROUP BY table_name, COLUMN_NAME
           HAVING count(*)=1 OR 
           COUNT(DISTINCT CONCAT_WS(',', NULL, ",
               GROUP_CONCAT(column_name)
           ,"))=2;")  
 FROM information_schema.COLUMNS
 WHERE table_schema="information_schema"
    AND table_name="COLUMNS" AND column_name!='TABLE_SCHEMA'
 INTO @sql;

 PREPARE stmt FROM @sql;
 EXECUTE @sql;

使用
信息\u模式
,下面是它的工作原理

首先,您知道
information\u schema.COLUMNS
表包含列定义。如果一列已更改,或某个表不存在,则它将反映在
信息\u schema.COLUMNS
表中

困难的部分是您必须比较
columns
表中的所有列。因此,您必须选择
TABLE\u CATALOG、TABLE\u NAME、COLUMN\u NAME、ORDINAL\u POSITION、COLUMN\u DEFAULT、
等等(这取决于您的MySQL版本)。 列列表是以下查询的结果:

  SELECT GROUP_CONCAT(column_name)
  FROM information_schema.COLUMNS
  WHERE table_schema="information_schema"
       AND table_name="COLUMNS" AND column_name!='TABLE_SCHEMA';
在这之后,我们只需选择表名,并搜索出现一次的列(其他表中不存在列),或者有两个不同定义的列(更改列)。因此,我们将在结果查询中有两个不同的计数来考虑这两种情况。

因此,我们将使用一个准备好的语句来检索所需列的列表,并对结果进行分组

生成的查询将为您完成以下所有过程:

 SELECT CONCAT(
      "SELECT DISTINCT TABLE_NAME
           FROM information_schema.COLUMNS
           WHERE TABLE_SCHEMA IN('db_dev', 'db_beta')
           GROUP BY table_name, COLUMN_NAME
           HAVING count(*)=1 OR 
           COUNT(DISTINCT CONCAT_WS(',', NULL, ",
               GROUP_CONCAT(column_name)
           ,"))=2;")  
 FROM information_schema.COLUMNS
 WHERE table_schema="information_schema"
    AND table_name="COLUMNS" AND column_name!='TABLE_SCHEMA'
 INTO @sql;

 PREPARE stmt FROM @sql;
 EXECUTE @sql;

“Maatkit”很古老;作为Percona工具包,它已经被Percona接管和改进。“Maatkit”是旧的;它已经被Percona作为Percona工具包接管和改进。您是否正在使用visual studio?如果是,请告诉我。您是否在visual studio中工作?如果是,那么告诉我。