比较两个不同数据库中的结构表并返回差异

时间:2015-07-31 16:06:58

标签: mysql

我需要比较两个数据库中的表,并找到column_name,data_type,is_nullable,column_default中的差异。我希望我的输出是

db1.table
id   | int   | NOT_NULL | AUTO_INCREMEMT
name | text  | NOT_NULL |
YYYY | text  | NOT_NULL | 
ZZZZ | text  | NOT_NULL | 

db2.table
id   | int   | NOT_NULL | AUTO_INCREMEMT
name | text  | NOT_NULL |
YYYY | text  |          | 

我想要的查询结果

COLUMN_NAME | DATA_TYPE | IS_NULLABLE | COLUMN_DEFAULT
------------|-----------|-------------|---------------
YYYY        | TEXT      | NOT_NULL    |
YYYY        | TEXT      |             |
ZZZZ        | TEXT      | NOT_NULL    |

到目前为止我所拥有的。

(SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'table_1' AND table_schema = 'db1')
UNION
(SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'table_1' AND table_schema = 'db2')

我得到的查询结果

COLUMN_NAME | DATA_TYPE | IS_NULLABLE    | COLUMN_DEFAULT
------------|-----------|----------------|---------------
id          | INT       | NOT_NULL       | AUTO_INCREMEMT
name        | TEXT      | NOT_NULL       |               
YYYY        | TEXT      | NOT_NULL       |               
YYYY        | TEXT      |                |               

这会关闭,但会返回太多行,并且只显示两个表中的列。例如,它不显示列ZZZZ,但它确实按预期返回YYYY列两次。

1 个答案:

答案 0 :(得分:1)

问题

如果问题缩小到一个句子,很容易找到解决方案,例如; 我想从<some table>检索一组唯一的部分行,其中一列是<some pair><some other pair>

考虑到上一句话,我们可以很快看到我们需要;

  • 一种选择我们想要检索哪些行的方法(WHERE + IN
  • 将直接等效行组合在一起的方法(GROUP BY
  • 过滤掉仅显示一次的行的方法(HAVING + COUNT

解决方案

SELECT
  table_schema, table_name, column_name, data_type, is_nullable, column_default
FROM
  information_schema.columns
WHERE 
  (table_schema,table_name) IN (('db1','table_1'), ('db2','table_1'))
GROUP BY
  column_name, data_type, is_nullable, column_default
HAVING
  COUNT(*) = 1

<子> <强>结果

+--------------+------------+-------------+-----------+-------------+----------------+
| table_schema | table_name | column_name | data_type | is_nullable | column_default |
+--------------+------------+-------------+-----------+-------------+----------------+
| db1          | table_1    | YYYY        | text      | NO          | NULL           |
| db2          | table_1    | YYYY        | text      | YES         | NULL           |
| db1          | table_1    | ZZZZ        | text      | NO          | NULL           |
+--------------+------------+-------------+-----------+-------------+----------------+

<强>制剂

CREATE DATABASE db1;
USE             db1;

CREATE TABLE `table_1` (
  `id`   INT  NOT NULL AUTO_INCREMENT,
  `name` TEXT NOT NULL,
  `YYYY` TEXT NOT NULL,
  `ZZZZ` TEXT NOT NULL,
  PRIMARY KEY (`id`)
);
CREATE DATABASE db2;
USE             db2;

CREATE TABLE `table_1` (
  `id`   INT  NOT NULL AUTO_INCREMENT,
  `name` TEXT NOT NULL,
  `YYYY` TEXT,
  PRIMARY KEY (`id`)
);