惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 司徒正美
美团技术团队
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
T
Tailwind CSS Blog
U
Unit 42
C
Check Point Blog
S
SegmentFault 最新的问题
Martin Fowler
Martin Fowler
Stack Overflow Blog
Stack Overflow Blog
云风的 BLOG
云风的 BLOG
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
罗磊的独立博客
小众软件
小众软件
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
DataBreaches.Net

博客园 - 放飞梦想

无法识别的配置节点 applicationSettings/* Properties.Settings 解决方法 删除重复数据只保留一条 SQL语句的事务处理及错误处理结构 SQLServer查询执行过的SQL记录 软件的自动更新实现 国家气象局提供的天气预报接口 SQL SERVER 2005 数据库状态为“可疑”的解决方法 Oracle 递归查询子节点和父节点 SQLite初体验 两张表数据同步用触发器 清理数据库日志 Sqlserver数据库还原一直显示“正在还原…”解决方法 如何查看 SQL Server 执行的历史 SQL 语句记录? MYSQL 命令行大全 (简洁、明了、全面) C#Datatable导入sqlserver数据库中,三种常见,快捷的方法 MongoDB下载页面 等级保护和分级保护区别与联系 等级保护和分级保护 SQL2005EXPress自动备份
SQL SERVER数据库表结构对比
放飞梦想 · 2026-06-01 · via 博客园 - 放飞梦想

SQL SERVER数据库表结构对比

1、获取数据库表结构

查询表信息

1 SELECT *
2 From INFORMATION_SCHEMA.TABLES
3 where table_type='BASE TABLE'
4 ORDER BY TABLE_TYPE,TABLE_NAME

查询列信息

1 SELECT *
2 FROM INFORMATION_SCHEMA.COLUMNS
3 WHERE TABLE_NAME='表名'

查询索引信息

SELECT *
FROM 
    数据库名.INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE 
    CONSTRAINT_TYPE = 'PRIMARY KEY'
OR 
    CONSTRAINT_TYPE = 'UNIQUE';

2. 比较两个数据库的结构

假设我们有两个数据库:DatabaseA和DatabaseB,我们可以分别对这两个数据库的表和列信息进行查询,然后进行对比。
获取数据库A的表和列

 1 USE DatabaseA;
 2 
 3 -- 获取表
 4 SELECT TABLE_NAME
 5 INTO #DBA_Tables
 6 FROM INFORMATION_SCHEMA.TABLES
 7 WHERE TABLE_TYPE = 'BASE TABLE';
 8 
 9 -- 获取列
10 SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
11 INTO #DBA_Columns
12 FROM INFORMATION_SCHEMA.COLUMNS;

获取数据库B的表和列

USE DatabaseB;

-- 获取表
SELECT TABLE_NAME
INTO #DBB_Tables
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE';

-- 获取列
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
INTO #DBB_Columns
FROM INFORMATION_SCHEMA.COLUMNS;

3. 对比表和列

接下来,我们可以通过JOIN操作来对比两个临时表中的内容,找出不同的部分。
对比表结构

SELECT A.TABLE_NAME AS DB_A_Table, B.TABLE_NAME AS DB_B_Table
FROM #DBA_Tables A
FULL OUTER JOIN #DBB_Tables B ON A.TABLE_NAME = B.TABLE_NAME
WHERE A.TABLE_NAME IS NULL OR B.TABLE_NAME IS NULL;

对比列结构

SELECT A.TABLE_NAME AS DB_A_Table, A.COLUMN_NAME AS DB_A_Column, B.COLUMN_NAME AS DB_B_Column
FROM #DBA_Columns A
FULL OUTER JOIN #DBB_Columns B ON A.TABLE_NAME = B.TABLE_NAME AND A.COLUMN_NAME = B.COLUMN_NAME
WHERE A.COLUMN_NAME IS NULL OR B.COLUMN_NAME IS NULL;

4. 结果分析

通过上述查询,你可以清楚地看到两个数据库在表及字段定义上的差异。记录下这些差异后,你可以考虑进行合并、优化或者其他数据操作。
除了表结构的其他对比

    约束和索引:可以使用sys.objects和sys.indexes查询相关信息。
    存储过程和视图:同样可以使用系统视图进行对比。

关系图示例

在对比数据库结构时,常常需要使用ER图来表示不同表之间的关系,同时更好地理解数据流向。以下是一个简单的使用Mermaid语法的ER图示例:

图片


结尾


通过上述的步骤和代码示例,我们可以手动对比两个SQL Server数据库的结构。尽管手动对比需要一定的SQL基础,但这帮助我们更深入了解数据库的工作原理和设计方式。同时,借助可视化工具和ER图,可以更清晰地呈现数据结构和关系。如需更加高效的对比,建议使用专业的SQL对比工具,以便更快地识别出结构差异,提升工作效率。希望本文对你在数据库管理的学习和实践中有所帮助!

提取索引信息