访问VBA - 无法创建关系

时间:2010-05-28 21:51:56

标签: ms-access vba ms-access-2007 access-vba

所以请看下面的例子:

Sub CreateRelation()

   Dim db As Database
   Dim rel As Relation
   Dim fld As Field

   Set db = CurrentDb
   Set rel = db.CreateRelation("OrderID", "Orders", "Products")

   'referential integrity
   rel.Attributes = dbRelationUpdateCascade

   'specify the key in the referenced table
   Set fld = rel.CreateField("OrderID")

   fld.ForeignName = "OrderID"

   rel.Fields.Append fld

   db.Relations.Append rel

End Sub

我一直收到错误:

  

找不到主表的引用字段的唯一索引。

如果我在此sub之前包含vba以在字段中创建索引,则会给出错误:

  

索引已经存在。

所以我想弄明白这一点。如果没有设置任何主键,会导致这不起作用吗?我很困惑,但我真的很想弄清楚这一点。因此orderIDProducts

中的外键

2 个答案:

答案 0 :(得分:2)

错误“找不到主表的引用字段的唯一索引”是由OrderId不能是Orders表的主键并且它必须没有唯一索引的事实引起的

其他错误“索引已存在”是由于Access在创建外键时会向外键添加非唯一索引。 Products表中可能已经存在一个名为“OrderId”的索引,当您尝试通过代码创建外键时,它正在创建冲突。您需要检查Products表上的TableDef.Indexes集合,以确保在添加外键之前尚未存在名为“OrderId”的索引。

答案 1 :(得分:1)

您可以通过界面手动创建关系,然后对其进行反向工程。这是一个立即窗口会话,我在其中检查了现有的关系:

? currentdb.Relations.Count
 1 

? currentdb.Relations(0).Name
parentchild

? currentdb.Relations(0).Table
tblParent

? currentdb.Relations(0).ForeignTable
tblChild

? currentdb.Relations(0).Fields.Count
 1 

? currentdb.Relations(0).Fields(0).Name
id

? currentdb.Relations(0).Fields(0).ForeignName
parent_id

作为参考,这是用于创建该关系的子:

Public Sub CreateRelationship()
Dim strSql As String
strSql = "ALTER TABLE tblChild" & vbNewLine & _
    "ADD CONSTRAINT parentchild" & vbNewLine & _
    "FOREIGN KEY (parent_id) REFERENCES tblParent (id);"
CurrentProject.Connection.Execute strSql
End Sub

在确认已经整理出哪些是外表和密钥之前,请不要理会dbRelationUpdateCascade属性。