将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)。
所以,任何有关原因的帮助:
MS-Access完全错误地导入PK。
为什么ALL_CONS_COLUMNS
表在列上随机添加了不正确的约束?
我现在正在使用ALL_CONSTRAINTS
表,它是正确的,也就是说,它只包含一个约束,即Table_X的PK是Column_X。
提前致谢!
答案 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;