在Firebird 2.5中获取非约束列



此查询

select rdb$field_name from rdb$relation_fields where rdb$relation_name='YOUR-TABLE_NAME';

完美地找到特定表中的所有列名。问题是,是否可以更改该查询,使其忽略所有键或外键列?

基本任务是找出哪些字段与约束没有关联。如果我们只使用主键、唯一键和外键约束,那么您需要查看表RDB$RELATION_CONSTRAINTSRDB$INDEX_SEGMENTS(您可以跳过RDB$INDICES(,以找出在这些类型的约束中使用了哪些列。

对于主键、外键或唯一键约束,RDB$RELATION_CONSTRAINTS填充了指向支持该约束的索引的RDB$INDEX_NAME。从RDB$INDEX_SEGMENTS表中,可以找到约束中涉及的列。

您可以在RDB$RELATION_FIELDS中找到表(或视图(的所有列,然后排除约束中使用的字段。

结果是这样的查询:

select rf.RDB$RELATION_NAME, rf.RDB$FIELD_NAME
from RDB$RELATION_CONSTRAINTS rc
inner join RDB$INDEX_SEGMENTS iseg
on iseg.RDB$INDEX_NAME = rc.RDB$INDEX_NAME
right join RDB$RELATION_FIELDS rf
on rf.RDB$RELATION_NAME = rc.RDB$RELATION_NAME and rf.RDB$FIELD_NAME = iseg.RDB$FIELD_NAME 
where rf.RDB$RELATION_NAME = 'YOUR_TABLE'
and rc.RDB$CONSTRAINT_NAME is null

最新更新