mysql - 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)
解决方案
您必须在创建表 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。
但是,我不建议允许在给定时间编辑基于多个表的表单 - 大多数服务器系统不允许这样做。
因此,在尝试在此处添加任何子记录之前添加并保存第一条记录。
推荐阅读
- database - 如何在电子表格中打开 .db(数据库)文件
- reactjs - 如何通过道具将对象数组中的src传递给另一个组件,有人可以向我解释为什么我不能显示我的图像
- flutter - Flutter:除了长按外,在点击时显示文本选择工具栏
- c# - C# 线程问题,我无法正常工作,在 Events_DataReceived 中调用
- ios - 将 SKScene 转换为视频
- android - Google Map API 不在发布模式下工作
- c# - 如何显示来自 WPF C# 中 ListView 中的 ListView 对象的数据
- cmake - CMakeLists.txt 错误。- “add_subdirectory(source) - 给定的源“源”不是现有目录”。我是 CMake 的新手,为此苦苦挣扎
- javascript - gtag_report_conversion 不计入带有 wpforms 的 ADS
- apache-spark - Spark - 对缓存的调用是否应该出现在物理(或逻辑)计划中?