探索主键与外键构建ERD及Oracle导入数据后查询约束的技术问询
嘿,我完全懂你现在的痛点——要构建ERD就得搞清楚主键和外键的关联,但select * from cat;根本帮不上忙,手动挨个查表效率太低了!下面给你几个实用的Oracle查询语句,能快速把你需要的约束信息揪出来:
1. 查询所有表的主键约束
这个语句能列出每个表的主键列和对应的约束名:
SELECT owner, table_name, constraint_name, column_name FROM all_cons_columns WHERE constraint_name IN ( SELECT constraint_name FROM all_constraints WHERE constraint_type = 'P' ) ORDER BY owner, table_name, position;
owner:表所属的数据库用户table_name:主键所在的表constraint_name:主键约束的名称column_name:主键对应的列(如果是复合主键,会按position顺序列出多个行)
2. 查询外键约束及关联关系
这个语句能帮你理清外键是如何关联到父表主键的,直接拿到ERD需要的关联逻辑:
SELECT c.owner AS child_table_owner, c.table_name AS child_table, cc.column_name AS foreign_key_column, c.constraint_name AS fk_constraint_name, p.owner AS parent_table_owner, p.table_name AS parent_table, pc.column_name AS primary_key_column, p.constraint_name AS pk_constraint_name FROM all_constraints c JOIN all_cons_columns cc ON c.owner = cc.owner AND c.constraint_name = cc.constraint_name JOIN all_constraints p ON c.r_owner = p.owner AND c.r_constraint_name = p.constraint_name JOIN all_cons_columns pc ON p.owner = pc.owner AND p.constraint_name = pc.constraint_name WHERE c.constraint_type = 'R' ORDER BY c.owner, c.table_name, cc.position;
这里的字段一目了然:child_table是包含外键的表,parent_table是被关联的主键表,foreign_key_column和primary_key_column就是对应的关联列。
3. 筛选特定用户或表的约束
如果你只关心当前登录用户的表,可以在查询里加个过滤条件:
-- 只查当前用户的主键 SELECT table_name, constraint_name, column_name FROM user_cons_columns WHERE constraint_name IN ( SELECT constraint_name FROM user_constraints WHERE constraint_type = 'P' ) ORDER BY table_name, position;
要是想聚焦某一张表,直接加AND table_name = 'YOUR_TABLE_NAME'就行(注意Oracle的表名默认是大写,所以要匹配大小写或者用双引号包裹)。
这些查询能帮你一次性获取所有需要的约束信息,不用再逐个表去翻啦,直接把结果整理一下就能用来画ERD了~
内容的提问来源于stack exchange,提问作者Maaz Mikail
相关产品推荐
相关产品推荐

