mysql:比较两个表的结构

时间:2011-03-29 08:53:03

标签: mysql

我有两张桌子。它们内部的值不相同,但大部分结构是相同的,其中一个表中有一些额外的字段。 以简化的形式,我有这样的东西:

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

我想将table_2结构复制到table_1,并将地址和语言设置为NULL。为此,我需要将它们显式设置为null,这不是很好,因为我的真实表是一团糟(超过30列)。我只有4-5个新字段,有没有办法比较两个表之间的结构,看看有什么区别?我会自己添加新字段。

3 个答案:

答案 0 :(得分:12)

以下(未经测试的)SQL应该为您提供两个表中的列列表 如果该列中存在该列,则in_table_1和in_table_2列将包含“是”。

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

答案 1 :(得分:1)

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


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;

原始答案由 / at https://dba.stackexchange.com/a/75651/193007

给出

答案 2 :(得分: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