2013-12-20 19 views
1

有一個table1具有table2的外鍵(一個table2到多個table1)。如何獲得表2字段的列表:如何在Firebird中獲取外鍵引用表

"table2.f1" 
"table2.f2" 
"table2.f3" 

只是通過給予「table1.f3」(即具有表2的外鍵)。如何從系統表中選擇此項?

謝謝!

回答

7

列出所有的FK表和字段引用。

SELECT 
    detail_index_segments.rdb$field_name AS field_name, 
    master_relation_constraints.rdb$relation_name AS reference_table, 
    master_index_segments.rdb$field_name AS fk_field 

FROM 
    rdb$relation_constraints detail_relation_constraints 
    JOIN rdb$index_segments detail_index_segments ON detail_relation_constraints.rdb$index_name = detail_index_segments.rdb$index_name 
    JOIN rdb$ref_constraints ON detail_relation_constraints.rdb$constraint_name = rdb$ref_constraints.rdb$constraint_name -- Master indeksas 
    JOIN rdb$relation_constraints master_relation_constraints ON rdb$ref_constraints.rdb$const_name_uq = master_relation_constraints.rdb$constraint_name 
    JOIN rdb$index_segments master_index_segments ON master_relation_constraints.rdb$index_name = master_index_segments.rdb$index_name 

WHERE 
    detail_relation_constraints.rdb$constraint_type = 'FOREIGN KEY' 
    AND detail_relation_constraints.rdb$relation_name = :table_name 
0

查詢得到全部使用以下查詢可以查詢特定表的外鍵引用的外鍵目標(即主鍵或唯一鍵)。我覺得這會給你足夠的信息,以得到它的特定列:

select 
PK.RDB$RELATION_NAME as PKTABLE_NAME 
,ISP.RDB$FIELD_NAME as PKCOLUMN_NAME 
,FK.RDB$RELATION_NAME as FKTABLE_NAME 
,ISF.RDB$FIELD_NAME as FKCOLUMN_NAME 
,(ISP.RDB$FIELD_POSITION + 1) as KEY_SEQ 
,RC.RDB$UPDATE_RULE as UPDATE_RULE 
,RC.RDB$DELETE_RULE as DELETE_RULE 
,PK.RDB$CONSTRAINT_NAME as PK_NAME 
,FK.RDB$CONSTRAINT_NAME as FK_NAME 
from 
RDB$RELATION_CONSTRAINTS PK 
,RDB$RELATION_CONSTRAINTS FK 
,RDB$REF_CONSTRAINTS RC 
,RDB$INDEX_SEGMENTS ISP 
,RDB$INDEX_SEGMENTS ISF 
WHERE FK.RDB$RELATION_NAME = ? and 
FK.RDB$CONSTRAINT_NAME = RC.RDB$CONSTRAINT_NAME 
and PK.RDB$CONSTRAINT_NAME = RC.RDB$CONST_NAME_UQ 
and ISP.RDB$INDEX_NAME = PK.RDB$INDEX_NAME 
and ISF.RDB$INDEX_NAME = FK.RDB$INDEX_NAME 
and ISP.RDB$FIELD_POSITION = ISF.RDB$FIELD_POSITION 
order by 1, 5 

這種查詢是Jaybird使用的一個改編,看到AbstractDatabaseMetaData