所以请看下面的例子:
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以在字段中创建索引,则会给出错误:
索引已经存在。
所以我想弄明白这一点。如果没有设置任何主键,会导致这不起作用吗?我很困惑,但我真的很想弄清楚这一点。因此orderID
是Products
表
答案 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属性。