关于Access的一些一般性问题,但希望有一个相当简单的答案:
当您在共享的多用户数据库中使用自动编号时,Access是否会执行任何操作以确保其分配的编号与其他用户同时添加记录的编号相同?
是否会立即为连接到该表的第一个用户声明下一个号码,或者等到新记录即将保存并在分配之前检查表中所有已保存记录的最大数量下一个号码?
它的独特性在多用户环境中是否健壮?
答案 0 :(得分:4)
为了完全回答你的问题,重要的是区分
“访问”(应用程序)和
“Access数据库引擎”(a.k.a。“ACE”)及其前身Jet数据库引擎。
当您在共享的多用户数据库中使用自动编号时,Access是否会执行任何操作以确保其分配的编号与其他用户同时添加记录的编号一致?
[...]
它的独特性在多用户环境中是否健壮?
是。与许多其他数据库引擎一样,ACE通过在将记录提交(写入)到表时正常分配该数字来确保Identity列(Access调用“AutoNumber字段”)在多用户环境中是唯一的。但是,ACE确实为Access提供了提前获取其AutoNumber值的机会(见下文)。
[Access]是否会立即为连接到该表的第一个用户声明下一个号码,
没有。简单地“连接到”表(例如,通过执行SELECT或打开Recordset)不会影响自动编号字段的计数器。
或者[Access]是否等到新记录即将保存并在分配下一个号码之前检查表中所有已保存记录的最大数量?
这取决于......
如果“表”是ODBC数据源的链接表(例如,带有IDENTITY列的SQL Server表),则是,“等待”,直到用户执行将提交(保存)新记录的内容,此时它将新记录提交给数据库服务器,然后检索该记录的AutoNumber值(例如,通过SQL Server中的SELECT @@IDENTITY
或其他数据库引擎的类似机制)。
但是,如果“表”是本机ACE / Jet表,那么您可能会注意到在开始键入新记录后立即出现新的AutoNumber值(例如,在数据表视图中,或以绑定形式)。在这种情况下,Access(应用程序)告诉ACE(数据库引擎)可能想要插入新记录并立即请求AutoNumber值。 ACE返回该值并递增计数器,以便另一个发出相同请求的用户将获得序列中的下一个数字。请注意,此过程“消耗”AutoNumber值:它将被使用(如果用户保存记录)或被丢弃(如果用户决定不保存记录)但它将不会被重用。这就是为什么
“自动递增”的ACE自动编号字段(与“随机”相对)有时会出现“间隙”,
如果您开始输入数据,请按 Esc 取消插入,然后再次开始输入,自动编号值不同(因为您“消耗”了以前的自动编号值,即使您没有保存记录)。
答案 1 :(得分:2)
答案是:是的,确实如此。与任何其他通用RDB一样,MS Access数据库非常适合在多用户环境中运行(虽然性能方面可能不是那么快,例如SQL Server,它的数据安全模型并不那么复杂强>)。此外,在表级提供主键(即自动编号)的唯一性;换句话说,它不是GUID(全球唯一ID)。