首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql:比较两个表的结构

mysql:比较两个表的结构
EN

Stack Overflow用户
提问于 2011-03-29 16:53:03
回答 3查看 12.5K关注 0票数 6

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

代码语言:javascript
复制
|table_1|    |table_2|
id           id
name         name
telephone    telephone
email        email
             address
             language

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-29 17:24:12

下面的(未经测试的) SQL应该会给出两个表中的列的列表。

如果表中存在in_table_1和in_table_2列,则该列将包含“是”。

代码语言:javascript
复制
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

票数 14
EN

Stack Overflow用户

发布于 2021-03-31 12:38:31

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

代码语言:javascript
复制
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提供

票数 1
EN

Stack Overflow用户

发布于 2020-10-14 19:19:01

我来得太晚了,但我正在张贴我的回复,这样人们就可以有更多的选择来选择表格

我遇到了将数据从旧数据库迁移到新数据库的挑战。一件事是表保留了他们的名字,但结构已经改变了。每个表上都给出了缺省值,如果没有提供,则由其他人来完成。关系型数据库管理系统是MariaDb 10.1,我使用以下脚本来获取列的差异。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5470036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档