为啥我的 MS Access 查询不可更新
Posted
技术标签:
【中文标题】为啥我的 MS Access 查询不可更新【英文标题】:Why is my MS Access query not updateable为什么我的 MS Access 查询不可更新 【发布时间】:2015-10-20 15:48:16 【问题描述】:大家好,
最近这一直困扰着我。 Access 说这个查询是不可更新的。我怎样才能让它可以更新?
当我删除 tblMasterContracts1 时,它是可更新的,但这不符合我的目标。这是一般关系数据库的限制吗?
SQL:
SELECT tblBuildings.[Building Address]
FROM (tblBuildings INNER JOIN (tblContacts
INNER JOIN tblContactsBuildings ON tblContacts.ContactID = tblContactsBuildings.ContactID)
ON tblBuildings.BuildingID = tblContactsBuildings.BuildingID)
INNER JOIN tblMasterContracts1 ON tblBuildings.BuildingID = tblMasterContracts1.BuildingID;
【问题讨论】:
图片查询没用。显示实际的 sql 那不是查询,那是 ER 图。即使是查询,您也必须解释“不可更新”。 @patricksweeney:访问用户知道“不可更新”是什么意思(来自痛苦的经历)。 @BillyNorbu,虽然并非所有图片都是无用的,但你的却是。正如 patricksweeny 暗示的那样,您发布了错误的图片。 因为您使用图片来说明以另一种格式更好地表达的事实与您是否使用Access绝对为零。我不会对那些试图告诉你你做错了什么的人好斗。我们告诉你这些事情,所以你实际上可以问一个好问题。此外,看看 Dan 的标签,他肯定对 Access 非常熟悉。这就是他在这个线程上的原因。 【参考方案1】:Allen Browne 组成了一个使查询不可更新的条件列表:
它有一个 GROUP BY 子句。 Totals 查询始终是只读的。
它有一个 TRANSFORM 子句。交叉表查询始终是只读的。
它在SELECT子句中使用First()、Sum()、Max()、Count()等。聚合记录的查询是只读的。
它包含一个 DISTINCT 谓词。在查询的属性中将唯一值设置为否。
它涉及一个 UNION。联合查询始终是只读的。
它在 SELECT 子句中有一个子查询。取消选中子查询下的显示框,或改用域聚合函数。
它在 FROM 子句中对多个表使用不同方向的 JOIN。删除一些表格。
JOIN 中的字段索引不正确:JOIN 字段上没有主键或唯一索引。
查询的记录集类型属性是快照。在查询的属性中将记录集类型设置为“动态集”。
查询基于另一个只读查询(堆叠查询)。
您的权限是只读的(访问安全。)
数据库以只读方式打开,或文件属性为只读,或数据库位于只读介质上(例如 CD-ROM、没有写入权限的网络驱动器。)
查询调用 VBA 函数,但数据库不在受信任的位置,因此代码无法运行。 (请参阅此 Access 2007 页面顶部的黄色框。)
查询输出的字段是计算字段 (Access 2010.)
(引自http://allenbrowne.com/ser-61.html。)
如您所见,这些条件无法仅通过查看 ER 图来验证。作为调试帮助,我建议从查询中删除表并重新添加它们,直到查询变为不可更新。一旦发生这种情况,请检查上面的列表以了解您添加的表格。
【讨论】:
谢谢,我知道这个列表。只有第 7 点可能适用于我的查询。您认为什么是好的解决方法?【参考方案2】:就是这个:
JOIN 中的字段索引不正确:JOIN 字段上没有主键或唯一索引。
您在 3 个左表之间有 1:n 关系,但与 tblMasterContracts1
没有定义关系。
所以你应该定义从tblMasterContracts1
到tblBuildings
的外键。
另外,tblContactsBuildings
应该有一个由ContactID
加上BuildingID
组成的复合主键。
【讨论】:
以上是关于为啥我的 MS Access 查询不可更新的主要内容,如果未能解决你的问题,请参考以下文章
MS Access UPDATE 查询失败,因为查询不可更新
如何在 MS Access 数据表视图中使用存储过程更新表数据