如何查看受主键、外键约束影响的列及相关字典视图问题
查看主键与外键约束关联列的方法
不同数据库的系统视图/信息_schema结构略有差异,以下是主流数据库的查询方式:
MySQL
- 查看主键关联列:
SELECT table_name, column_name, constraint_name FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE constraint_type = 'PRIMARY KEY' AND table_schema = '你的数据库名';
- 查看外键关联列(含引用的表和列):
SELECT kcu.table_name AS 外键所在表, kcu.column_name AS 外键列, kcu.constraint_name AS 外键约束名, kcu.referenced_table_name AS 引用表, kcu.referenced_column_name AS 引用列 FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu WHERE kcu.constraint_type = 'FOREIGN KEY' AND kcu.table_schema = '你的数据库名';
Oracle
Oracle将约束定义和关联列分开存储,需要关联两个视图:
- 查看主键列:
SELECT c.table_name, cc.column_name, c.constraint_name FROM USER_CONSTRAINTS c JOIN USER_CONS_COLUMNS cc ON c.constraint_name = cc.constraint_name WHERE c.constraint_type = 'P'; -- P代表主键
- 查看外键列(含引用信息):
SELECT c.table_name AS 外键所在表, cc.column_name AS 外键列, c.constraint_name AS 外键约束名, c.r_constraint_name AS 引用的主键约束名, (SELECT table_name FROM USER_CONSTRAINTS WHERE constraint_name = c.r_constraint_name) AS 引用表, (SELECT column_name FROM USER_CONS_COLUMNS WHERE constraint_name = c.r_constraint_name) AS 引用列 FROM USER_CONSTRAINTS c JOIN USER_CONS_COLUMNS cc ON c.constraint_name = cc.constraint_name WHERE c.constraint_type = 'R'; -- R代表外键
PostgreSQL
- 查看主键列:
SELECT tc.table_name, kcu.column_name, tc.constraint_name FROM information_schema.table_constraints tc JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name WHERE tc.constraint_type = 'PRIMARY KEY' AND tc.table_schema = 'public'; -- 替换为你的schema
- 查看外键列:
SELECT tc.table_name AS 外键所在表, kcu.column_name AS 外键列, tc.constraint_name AS 外键约束名, kcu.referenced_table_name AS 引用表, kcu.referenced_column_name AS 引用列 FROM information_schema.table_constraints tc JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = 'public';
为何数据字典将主键/外键列单独放在独立视图中?
- 职责单一化:主键、外键属于完整性约束的核心部分,和普通列的基础元数据(如数据类型、长度、默认值)逻辑上是两类信息。独立视图能让每个视图只专注一类元数据,避免通用视图过于臃肿。
- 提升查询性能:这类约束信息是DBA、开发者高频查询的内容,独立存储可以针对性优化索引和存储结构,减少查询时的关联过滤开销,更快拿到结果。
- 语义更清晰:主键是表的唯一标识,外键是表间关联的核心纽带,单独视图能让使用者快速定位这类关键元数据,不用从海量的通用列信息里筛选。
- 扩展灵活性强:如果后续要增加约束的属性(比如外键的
ON UPDATE规则、延迟约束开关),直接在独立视图里扩展字段即可,不会影响普通列元数据视图的结构,避免牵连性改动。
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

