MS-Access Oracle链接表主键错误

时间:2015-07-17 11:12:24

标签: database oracle ms-access

将Oracle数据库与MS Access链接时,我一直试图找出哪个密钥是主密钥(PK)。

右键单击并在链接表上选择Design View会打开一个页面,说明每个字段中保存的数据类型,例如短文本,它还包含特定字段旁边的key符号并说Part of the primary key

我对此持怀疑态度,因为我做的第一个表显然有一个由5列组成的复合主键,其中两列实际上可能是空的。我在网络上进一步发现了this Oracle page。似乎通过查看ALL_CONS_COLUMNS表,您可以看到实际的PK - 并且看起来似乎可以,并且在前面的示例中给出的表中只有一个PK。

然而,在这个ALL_CONS_COLUMNS表中似乎有一种奇怪的现象,对于有问题的表,它将PK列为两列的约束(注意:不是复合键,它表示对column_x的约束是column_x是一个PK,它也相当随机地表明对column_y的约束是column_x是PK)。

所以,任何有关原因的帮助:

  1. MS-Access完全错误地导入PK。

  2. 为什么ALL_CONS_COLUMNS表在列上随机添加了不正确的约束?

  3. 我现在正在使用ALL_CONSTRAINTS表,它是正确的,也就是说,它只包含一个约束,即Table_X的PK是Column_X。

    提前致谢!

1 个答案:

答案 0 :(得分:1)

ALL_CONSTRAINTS未显示哪些列是主键约束的一部分。 CONSTRAINT_TYPE列会告诉您特定约束是P rimary Key约束,但您需要查看ALL_CONS_COLUMNS以找出主键组成的列。另请注意,您无法判断约束是否是其名称的主键,因为非主要U nique约束可以命名为TABLE_PK,即使它不是主键。

Access可能会获取它在链接表上找到的第一个Unique约束,并将其作为主键。

此查询是否将您的约束显示为单个列或复合主键?

select ac.OWNER
     , ac.TABLE_NAME
     , ac.CONSTRAINT_NAME
     , case when max(nvl(position,0)) over (partition by ac.OWNER, ac.TABLE_NAME, ac.CONSTRAINT_NAME) > 1 then 'Composite '
       end ||
       case ac.CONSTRAINT_TYPE
         when 'P' then 'Primary Key'
         when 'U' then 'Unique'
         when 'R' then 'Foreign Key'
         when 'C' then 'Check'
         else ac.CONSTRAINT_TYPE
       end CONSTRAINT_TYPE
     , acc.COLUMN_NAME
     , acc.POSITION
  from all_constraints ac
  join all_cons_columns acc
    on acc.OWNER = ac.OWNER
   and acc.TABLE_NAME = ac.TABLE_NAME
   and acc.CONSTRAINT_NAME = ac.CONSTRAINT_NAME
 where ac.owner = user
 order by ac.table_name
     , ac.CONSTRAINT_NAME
     , acc.POSITION;