我需要比较两个数据库中的表,并找到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列两次。
答案 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`)
);