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中工作?如果是,那么告诉我。