MySQL:比较两个表的结构

7

我有两个表格,它们内部的值并不相同,但大部分结构都是相同的,其中一个表格有一些额外字段。 简化后,我的情况如下所示:

|table_1|    |table_2|
id           id
name         name
telephone    telephone
email        email
             address
             language

我想将table_2的结构复制到table_1,并将地址和语言设置为NULL。为了做到这一点,我需要明确地将它们设置为null,这不是很好,因为我的真实表格很混乱(超过30列)。虽然我只有4-5个新字段,但是否有一种方法可以仅比较两个表之间的结构并查看差异?然后我就可以自己添加新字段了。


我制作了一个免费的工具,可以生成ALTER语句,使第二个表与第一个表相同,但仍处于测试阶段。https://tablediff.com/ - Mihai
3个回答

17

以下(未经测试的)SQL应该会给出两个表中列的列表。
如果该列存在于该表中,则in_table_1和in_table_2将包含“Yes”。

select column_name
      ,max(case when table_name = 'table_1' then 'Yes' end) as in_table_1
      ,max(case when table_name = 'table_2' then 'Yes' end) as in_table_2
  from information_schema.columns
 where table_name in('table_1', 'table_2')
   and table_schema = 'your_database'
 group
    by column_name
 order
    by column_name;

你可以添加having count(*) = 1来仅返回不在两个表中的列。

你可能还想添加数据类型。可以查看INFORMATION_SCHEMA


2

查看两个不同数据库中两个表格的差异


SELECT column_name,ordinal_position,data_type,column_type FROM
(
    SELECT
        column_name,ordinal_position,
        data_type,column_type,COUNT(1) rowcount
    FROM information_schema.columns
    WHERE
    (
        (table_schema='db1' AND table_name='tb1') OR
        (table_schema='db2' AND table_name='tb2')
    )
    AND table_name IN ('product_today','product_yesterday')
    GROUP BY
        column_name,ordinal_position,
        data_type,column_type
    HAVING COUNT(1)=1
) A;

原始答案由 / 在 https://dba.stackexchange.com/a/75651/193007 给出。


0

我可能有点晚了,但我还是发表了我的回应,以便有人可以有更多的选择。

我接到了一个挑战,需要将数据从旧数据库迁移到新数据库。其中一件事是表保留了它们的名称,但结构已经改变了。 每个表的默认值都给了我,如果没有提供,则由其他人来完成。 RDBMS 是 MariaDb 10.1,我使用以下脚本获取列之间的差异。

set @tem = cast('tabl1' as char(90));
set @db_new = cast('db_new' as char(90));
set @db_old = cast('db_old' as char(90));
select n.column_name newCol, (case when o.column_name is null then '''''' else
o.column_name end) oldCol from information_schema.columns as n 
left join information_schema.columns as o on (n.table_name = o.table_name and n.column_name = o.column_name and o.table_schema = @db_old)
where 
n.table_name = @tem
and
n.table_schema = @db_new

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接