首页 > 解决方案 > MS Access:如何自动将一个也是 FK 的 PK 填充到另一个表自动递增 PK?

问题描述

我正在更新通过 ODBC 连接器连接到 MySQL 数据库的 MS Access 应用程序。我目前遇到一个问题,我有一个表单,记录源是一个连接多个表的查询,两个问题表的结构大致如下所示。

Table1 {
   id int not null auto increment,
   ...,
   primary key(id)
}

Table2 {
   table1ID int not null default 0,
   ...,
   primary key(table1ID),
   constraint `fk` foreign key (table1ID) references Table1 (id) on delete cascade on update cascade
}

问题在于 Table2 的主键也是引用 Table1 的 id 的外键,并且因为它们加入到记录源的同一查询中,所以它们都是同时创建的。因此,当我尝试在 MS Access 中添加新记录时,它不会保存记录,因为 Table2 的“table1ID”为空,但 Table1 的“id”是自动递增的,因此在第一次保存记录之前不会创建。所以我的问题是......有没有办法让 MS Access/MySQL 使用 Table1 的“id”中的自动增量值自动填充 Table2 的“table1ID”,以便 MS Access 能够保存记录?

尝试保存新记录时返回的错误消息如下:

Run-time error '3155':

ODBC--insert on a linked table 'Table2' failed.

[MySQL][ODBC 8.0(a)Driver][mysqld-8.0.27]Column 'table1ID' cannot be null (#1048)

标签: mysqlvbams-access

解决方案


您必须在创建表 1 记录的表单中执行保存。

事实上,这也是为什么当你将焦点移到子表单时,Access 会在表单中执行自动记录保存的原因。Access 会执行此操作,因为在您保存 reocrd 之前不会创建新 reocrd 上的自动编号 ID(至少在使用 ODBC 数据源时是这种情况)。仅使用访问权限时,不需要 reocrd 保存来生成 PK id,但使用 sql server 或 MySql - 您必须保存记录。

如前所述,使用表单+子表单,访问会自动执行此操作。

但是,假设我在一个表单上,刚刚添加了一个新的记录,现在我想运行一些代码,或者启动另一个表单?我必须先强制​​进行 reocrd 保存以生成 PK 自动编号。

因此,代码将如下所示:

if me.dirty then me.Dirty = false   ' save reocrd
' now do your other business here, code that follows, or 
' even launch another form, or whatever.

因此,使用 me.Dirty = false 保存表单记录的简单强制将强制生成自动编号。

我不知道 MySQL 如何处理两个表之间的连接,但作为一般规则,连接中的两个表中只有一个可以在给定时间更新。

因此,您必须打破此处的步骤,或者不允许编辑两个表(或至少同时修改)。

Access 确实允许两个表都变脏,但据我所知,服务器端系统不允许。因此,您可以在表单上进行编辑时,当您退出基于一条记录的控件时,您将执行 me.Dirty = false 以生成自动 PK。

但是,我不建议允许在给定时间编辑基于多个表的表单 - 大多数服务器系统不允许这样做。

因此,在尝试在此处添加任何子记录之前添加并保存第一条记录。


推荐阅读