【问题标题】:Why is my query not updateable?为什么我的查询不可更新?
【发布时间】:2014-08-07 16:15:38
【问题描述】:

我正在尝试在 Access 中为用户构建一个可更新的视图。基本上,基础表如下所示:

Accounts
--------
accountId
accountName
accountHolder

TransactionStatements
------------
statementId
accountId
received
month
year

用户想要一个如下所示的查询(视图):

StatementView
-------------
accountName
accountHolder
year
janReceived
febReceived
marReceived
etc...

使用转置的 SQL 实现这一点很简单,但结果视图不可更新。

我也尝试过明确地执行多个连接来完成此操作:

PARAMETERS [Enter Year:] Long;
SELECT accountName, accountHolder, year, 
FROM ((Accounts a
INNER JOIN TransactionStatements ts1 ON a.accountID = ts.accountID) 'AND month = 1 (This isn't allowed for some reason?)
INNER JOIN TransactionStatements ts2 ON a.accountID = ts.accountID) 'AND month = 2 (This isn't allowed for some reason?)
WHERE ts1.month = 1 AND ts2.month = 2 AND ts1.year = ([Enter Year:]) AND ts2.year = ([Enter Year:])

但是,一旦我添加第二个 INNER JOIN,结果就会再次变得不可更新。我看过这个MS help page,但它并没有帮助我找出正确的方法来做到这一点。

它建议使用表单作为替代方案,但在 Access 中构建自定义表单似乎比编写视图更加神秘和复杂。

有什么建议吗?

【问题讨论】:

  • 整个东西是放在 Access 中,还是后端放在 SQL Server 之类的东西中?
  • 遗憾的是,这一切都在 Access 中。
  • 检查我的回答中提到的任何实例。特别注意关系表,确保没有多对一对多连接
  • 谢谢,但我在我的问题中链接到的文章中看到了这一点。我希望有人知道一些技巧可以使查询可更新。

标签: ms-access ms-access-2010


【解决方案1】:

查看这份非常详尽的记录集可更新和不可更新原因列表:

记录集始终可更新时

记录集在以下情况下始终是可更新的:

  1. 它基于一个表。
  2. 它基于基于单个表的查询。
  3. 它基于基于具有一对一关系的表的查询。

当记录集永远不可更新时

在以下情况下,记录集永远不可更新:

  1. 它基于交叉表查询。
  2. 它基于联合查询。
  3. 这是一个聚合查询,用于计算字段中值的总和、平均值、计数或其他类型的总计。
  4. 它是一个更新查询,它引用来自交叉表查询、选择查询或子查询的更新至行中的字段 包含总计或聚合函数 注意:通过在更新查询的更新至行中使用域聚合函数,您可以引用交叉表查询、选择查询或包含总计或聚合函数的子查询中的字段。
  5. 它基于一个包含没有唯一索引的链接 ODBC 表的查询。
  6. 数据库以只读方式打开或位于只读驱动器上。
  7. 这是一个 SQL 传递查询。
  8. 这是一个 UniqueValues 属性设置为 Yes 的查询。 (也就是说,它是一个带有 DISTINCT 谓词的查询。)
  9. 笛卡尔连接(即包含多个表或查询的查询,并且这些表或查询未通过连接进行连接 设计视图中的行。)
  10. 基于三个或更多表的查询,其中存在多对一多的关系。注意:虽然你不能更新 直接查询中的数据,可以更新表单中的数据 或基于表单的 RecordsetType 查询的数据访问页面 属性设置为 Dynaset(不一致的更新)。
  11. 计算字段。即使查询本身是可更新的,如果查询中的列是基于公式的,该字段也不能 更新。但是,如果公式中的其他字段被更新, 计算字段将自动更新。

记录集在特定条件下可更新

某些查询,尤其是联接中涉及的查询,在某些条件下不可更新,但在其他条件下会更新。在其他查询中,即使查询本身是可更新的,某些字段也不会。以下是查询问题的案例及其对应的解决方案。

  1. 基于没有关系的表的联接查询。

    •问题:如果查询基于两个或多个未建立关系的表(启用参照完整性),则查询将不可更新。

    •解决方案:在“一侧”表的联接中使用的所有字段上创建主键或唯一索引。需要明确的是,这意味着基于所有字段的一个主键或唯一索引,而不是每个字段上的单独索引。 在基于具有一对多关系 (1:M) 的表联接的查询中,您可能无法编辑一个或多个字段中的数据。

  2. 从“一”端加入字段

    •问题:如果您在两个表之间创建了 1:M 关系,则无法在关系的“一”侧更改表的主键字段(在 Join 中使用)。

    •解决方案:在两个表之间启用级联更新。

  3. 新记录,如果“多”侧连接字段未出现在数据表中

    •问题:在基于 1:M 关系的查询中,您可以创建新记录并填写来自“one”侧表的字段,但如果连接字段来自“many”侧表在查询中不可见(即外键),您不能将数据添加到“多”侧字段。

    •解决方案:将“多”侧表中的连接字段(即外键)添加到您的查询中,以允许添加新记录。

  4. “一”侧的新记录与其他“一”侧记录重复。

    •问题:添加新记录时,如果您尝试在“one”侧字段中键入内容,您将尝试创建新记录。即使您使用相同的主键值,它也会给您一个错误。

    •解决方案:向“多”侧连接字段(外键)添加一个与现有记录的“一”侧连接字段(主键)匹配的值。 “一”侧值将简单地出现。

  5. 在“一”端更新数据后,从“多”端加入字段

    •问题:如果您当前正在从关系的“一”侧编辑字段,则无法更改“多”侧连接字段(外键)。

    •解决方法:保存记录;然后您就可以对“多”侧连接字段进行更改。

  6. 新记录,如果没有输出 ODBC 表的整个唯一键

    •问题:这与Never Updateable 下的#5 不同。在这种情况下,链接的 ODBC 表的主键存在,但未添加到查询中。

    •解决方案:选择 ODBC 表的所有主键字段以允许插入其中。

  7. 查询没有更新数据权限

    •问题:未授予更新数据权限的查询(或基础表)。

    •解决方案:要修改数据,必须分配权限。

  8. 查询没有删除数据权限

    •问题:未授予删除数据权限的查询(或基础表)

    •解决方案:要删除数据,必须分配权限。 结论

不可更新记录集的原因多种多样。有些有解决方案,有些则没有。希望这份清单能帮助您了解其中的区别。

以上内容逐字逐句摘自以下博客:This Recordset Is Not Updateable. Why? 我觉得最好是复制并完全归因而不是试图解释,以便提供所有信息。

我建议您查看的第一件事可能是您的表具有正确的索引并且它们的关系设置正确。这通常是我首先要做的两件事,它们往往可以解决我自己的大部分“不可更新查询”问题。

【讨论】:

  • 很好的解释@Johnny Bones!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 2020-01-13
  • 1970-01-01
相关资源
最近更新 更多