我有两张桌子。它们内部的值不相同,但大部分结构是相同的,其中一个表中有一些额外的字段。 以简化的形式,我有这样的东西:
|table_1| |table_2|
id id
name name
telephone telephone
email email
address
language
我想将table_2结构复制到table_1,并将地址和语言设置为NULL。为此,我需要将它们显式设置为null,这不是很好,因为我的真实表是一团糟(超过30列)。我只有4-5个新字段,有没有办法比较两个表之间的结构,看看有什么区别?我会自己添加新字段。
答案 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