如何从 MySQL 数据库中获取最后一个插入值并更新 Access 中的字段?
Posted
技术标签:
【中文标题】如何从 MySQL 数据库中获取最后一个插入值并更新 Access 中的字段?【英文标题】:How can I get the last insert value from MySQL database and update a field in Access? 【发布时间】:2018-08-24 09:38:09 【问题描述】:我有一个涉及人类遗骸的复杂数据库,因此输入数据的 Access 表单也相当复杂。我有几个子表单(Skeleton_index、Element_index 和其他一些)。我提到的两个子表单在一个未绑定的主表单上将数据发送到它们各自的字段(element_link、skeleton_link),其他表单从中使用数据。对于 Skeleton_index,用户必须输入个人的姓名,它会立即显示在 Skeleton_index 字段中。我遇到的问题是我不希望用户必须输入 Element_index 的主键数据,因为它应该是 auto_increment。这是一个问题,因为 Element_id 中的自动递增值不会立即显示在 element_link 字段中。为了让它显示,用户必须创建一个新元素,然后返回到他们正在编辑的那个。我想避免这种情况。
我想要做的是在 Element_id 文本框获得焦点时将其更新为新的 auto_increment 主键。 VBA 代码应该从 mysql (InnoDB) Element_index 表中获取最后一个主键,添加一个,然后更新 Element_index 表单中 Element_id 字段中的值。
这是我的尝试,但完全失败了。
Private Sub Element_id_GotFocus()
SQL = "SELECT LAST_INSERT_ID();"
lastID = DoCmd.RunSQL(SQL)
newID = Int(lastID) + 1
Element_id.Value = newID
End Sub
编辑:
数据库最初只有一个用户,但未来可能会有更多。
解决方案: 我添加了一个带有两个宏的按钮:一个用于保存插入的记录,另一个用于刷新表单。无需复杂的 VBA。
【问题讨论】:
您是否尝试过保存记录并在一些初始数据输入后刷新以“获取”PK 号?If Me.Dirty Then Me.Dirty = False
您阅读了docs 和dev.mysql.com/doc/refman/8.0/en/getting-unique-id.html?我还通过首先查找 max(id) 然后递增然后插入来解决。如果没有有效的错误 ID,您的方法可能会在两次连续插入时失败。
哈哈!我真傻。我什至不认为刷新会是一种选择。我之前尝试保存数据并且它不会更新,但我想我所要做的就是添加刷新宏。谢谢!
【参考方案1】:
你的尝试在很多方面都是错误的。主要有:
-
您不能使用
DoCmd.RunSQL
运行选择查询。它只运行操作查询。
您需要使用直通查询来运行包含 MySQL 特定函数的查询。
您不能使用LAST_INSERTED_ID()
,除非您通过用于将行插入您感兴趣的表的同一连接来执行它。
您最好使用 QueryDef 执行直通查询,并使用 INFORMATION_SCHEMA.TABLES 表检索下一个自动编号:
'Create a new temporary query, uses `With` instead of storing it in a variable
With CurrentDb.CreateQueryDef("")
'Make it a pass-through query that connects to MySQL
.Connect = "ODBC;<enter connection string here>"
'Set the SQL for the query: queries table definition, gets auto_increment seed
.SQL = "SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ""<table name here>"" AND TABLE_SCHEMA = ""<database name here>"""
'The query should return records (not an action query)
.ReturnsRecords = True
'Execute the query, get the results into a snapshot-type recordset
'And set your field equal to the first column of the first row of the recordset
Element_id.Value = .OpenRecordset(dbOpenSnapshot).Fields(0).Value
End With
【讨论】:
你测试过这个吗?由于未反映用户,因此在大量更新时不可靠。 @ComputerVersteher 我手边没有 MySQL 数据库,但你上面提到的文档是关于LAST_INSERTED_ID()
的。我没有使用它,而是检查表中的下一个种子。这通常应该更可靠,尽管您可能会遇到多个用户的问题。但是这个问题的整个前提是错误的:你根本不应该预测下一个 ID,因为有人可能会在你之前插入一些东西。
虽然我认为我已经找到了解决方案(请参阅 Minty 的评论),但我很想知道您的建议有什么作用?你能一步一步解释你的代码吗?
@kelkka 我已经添加了 cmets,每条评论都解释了它下面的下一个未注释的行
@ErikvonAsmuth 谢谢,这很有帮助。【参考方案2】:
当 ID 无效时,我依赖错误。
首先获取 max(ID),然后递增,最后使用递增的 ID 执行 Insert-Query。如果没有错误,你有 FK 的 ID,错误处理它(例如,用下一个增量重试)
On Error Goto myErrHandler
Dim newID as Long
newID = Nz(DMax("ID","myTable"),0) + 1
With CurrentDb()
.Execute "INSERT INTO myTable (ID) Values (" & newID & ")", dbFailOnError
End With
'...
' here code for inserts in tables with ID as FK
【讨论】:
以上是关于如何从 MySQL 数据库中获取最后一个插入值并更新 Access 中的字段?的主要内容,如果未能解决你的问题,请参考以下文章