2011-03-08 53 views
1

我想从Oracle中提取一些关于外键的元数据。我正在使用“all_constraints”来查找所有参考约束信息和“all_cons_columns”以查找实际列。但是,我无法在外键中获得列的顺序。查找外键列顺序

以下是4个例表中的所有3列。其中3个表引用表“tab_d”,但外键列的顺序不同。这个顺序没有反映在“all_cons_columns”视图中,那么还有另外一个可以获得这些信息的地方吗?

create table tab_d (
    col_a int, 
    col_b int, 
    col_c int, 
    constraint tab_d_pk primary key (col_a, col_b, col_c) 
); 

create table tab_e (
    ref_col_a int, 
    ref_col_b int, 
    ref_col_c int, 
    constraint tab_e_fk foreign key (ref_col_b, ref_col_c, ref_col_a) 
     references tab_d(col_b, col_c, col_a) 
); 

create table tab_f (
    ref_col_a int, 
    ref_col_b int, 
    ref_col_c int, 
    constraint tab_f_fk foreign key (ref_col_b, ref_col_c, ref_col_a) 
     references tab_d(col_c, col_a, col_b) 
); 

create table tab_g (
    ref_col_a int, 
    ref_col_b int, 
    ref_col_c int, 
    constraint tab_g_fk foreign key (ref_col_c, ref_col_b, ref_col_a) 
     references tab_d(col_c, col_b, col_a) 
); 

我从“all_cons_columns”得到的信息如下所示,例如我的表“tab_g”我认为位置显示列顺序ref_col_c = 1,ref_col_b = 2和ref_col_a = 3它显示列在主键中的顺序。

CONSTRAINT_NAME TABLE_NAME COLUMN_NAME POSITION 
TAB_F_FK   TAB_F  REF_COL_A 2 
TAB_F_FK   TAB_F  REF_COL_B 3 
TAB_F_FK   TAB_F  REF_COL_C 1 
TAB_E_FK   TAB_E  REF_COL_A 1 
TAB_E_FK   TAB_E  REF_COL_B 2 
TAB_E_FK   TAB_E  REF_COL_C 3 
TAB_G_FK   TAB_G  REF_COL_A 1 
TAB_G_FK   TAB_G  REF_COL_B 2 
TAB_G_FK   TAB_G  REF_COL_C 3 
+1

的'ALL_CONS_COLUMNS'结果显示如何在子表映射到父表的主键列中的'COLUMN_NAME',自己从'ALL_CONSTRAINTS'视图获得。在定义外键时,列出列的顺序没有什么区别 - 它只是与父列有关的映射,因此它们必须在两个子句中都处于相同顺序。 – 2011-03-08 10:51:10

+0

列在外键约束定义中列出的顺序的意义是什么?在父表中声明列的顺序影响默认情况下如何创建强制执行主键约束的索引。如果您在子表上创建索引,则可以获取该索引中列的顺序。 – 2011-03-08 11:00:17

+0

为了方便起见,我想要列的顺序,这样我就能够将元数据尽可能接近create语句,但如果这是不可能的,我将只使用“all_cons_columns”中的位置 - 感谢澄清 – aweis 2011-03-08 13:30:18

回答

5

反映在ALL_CONS_COLUMNS视图的顺序 - 通过调用位置的列。