我有一个Access数据库。让我们假装它是一家宠物商店。
有一张动物桌。
Animals (animal_id, birth_date, price)
然后是我们出售的不同类型动物的特定表格。
Dogs (animal_id, bark_volume)
Cats (animal_id, collar_size, shedding_rate)
Fish (animal_id)
鱼没有趣味,所以它们没有任何特殊领域。 Fish表存在,因此您知道Animals表中的哪些记录是鱼。
现在,我有一个将动物添加到宠物商店的通用表格。在你获得表格之前,首先要说明你要添加什么样的动物。基于此,表单显示/隐藏字段,更改其记录源,并将字段绑定到适当的数据列。表单从查询DogInfo,CatInfo和FishInfo中提取数据。
现在,当你进入一只狗或一只猫时,一切都很好。一个记录被添加到动物和狗或猫。
然而,当你进入一条鱼时,你得到的只是一只动物,没有鱼。
可能导致这种情况的原因是什么?是不是因为Fish桌上缺少其他栏目而引起的?
(让我们不要理会用select查询更新表格根本没有意义。我没想到Access首先让我这么做,但Access的座右铭似乎是“做错了”容易做的事情和正确的事情很难做到。“数据库相对简单且不经常使用,并且它比我开始工作之前至少好100倍,所以我真的不太担心这个问题,只要我能使它发挥作用。)
答案 0 :(得分:7)
“Fish表上缺少其他列是否会导致它?”
是 - 当你在子记录(狗和猫)上输入数据时,Access会自动填写父ID(animal_id)
由于鱼类记录没有数据条目,因此无法创建。你必须在代码中这样做。不确定您的表单和数据源是如何设置的,但您可以在其中一个表单事件上执行以下操作:
Fish![animal_id] = Animal![animal_id]
修改
在您的FishInfo查询中,您必须为Fish.[animal_id]
添加别名 - 您不能有两个具有相同名称的字段 - 称之为Fish_animal_id
然后在Form_BeforeUpdate事件中输入:
Me.Fish_animal_id = Me.animal_id
答案 1 :(得分:2)
您是否考虑过在不同的表上配置关系?鉴于上面的设计,我首先会在特定动物表中添加一个识别列,并将其设置为主键。 E.g:
Dogs(DOG_ID, animal_id, bark_volume)
Cats(CAT_ID, animal_id, collar_size, shedding_rate)
等。在关系视图中,您可以定义从Animals.ANIMAL_ID
到Dogs.animal_id
的一对多(一对一?)关系。然后,您可以将Animals表连接到表单上的组合/列表框控件,以从该表中选择记录。我认为如果正确配置控件,您甚至可以从该控件创建新记录(或者您可以使用子窗体)。
答案 2 :(得分:0)
Dogs / Cats / Fish桌子没有单独的ID吗?假设唯一的区别是列数,我很好奇,如果突然修复它。
答案 3 :(得分:0)
除了糟糕的设计之外,您是否在各种表之间建立了关系?你是否设置了表来强制引用完整性?