Access数据库中SQL语句复制记录时重复插入问题求助
解决Access INSERT语句重复复制数据的问题
首先,咱们拆解下你的问题:代码执行后数据被复制两次,排除了无代码时自动记录的情况,那大概率是代码被触发两次,或者查询本身返回了重复的源记录。咱们一步步来排查:
1. 先确认源数据是否本身存在重复
先单独运行你的SELECT部分,看看返回多少条记录:
打开Access的查询设计,粘贴下面的SQL并运行(确保表单NewWork处于打开状态):
SELECT Detail_tbl.Index, Detail_tbl.Section, Detail_tbl.Group, Detail_tbl.Detail, Detail_tbl.[No Samples], Detail_tbl.CPS, Detail_tbl.[Detail Status], Now() AS Expr2, Left([Job Number],10) AS Expr1 FROM Detail_tbl WHERE Left([Detail_tbl].[Job Number],10)=[Forms]![NewWork]![Job_Number]
如果结果是2条完全一致的记录,那问题出在源数据重复。这时候可以在SELECT里加DISTINCT来去重,修改后的代码如下:
mySQL = "INSERT INTO Detail_tbl ( [Index], [Section], [Group], [Detail], [No Samples], CPS, [Detail Status], Date_added, [Job Number] )" & _ " SELECT DISTINCT Detail_tbl.Index, Detail_tbl.Section, Detail_tbl.Group, Detail_tbl.Detail, Detail_tbl.[No Samples], Detail_tbl.CPS, Detail_tbl.[Detail Status], Now() AS Expr2, Left([Job Number],10) AS Expr1" & _ " FROM Detail_tbl" & _ " WHERE (((Left([Detail_tbl].[Job Number],10))=[Forms]![NewWork]![Job_Number]))" DoCmd.RunSQL mySQL Me.Job_Details.Enabled = True Me.[Job Details].Requery
2. 检查代码是否被触发了两次
这是更常见的场景,比如:
- 你的按钮同时绑定了
Click和DoubleClick事件,单次操作可能触发两次执行; - 代码放在了表单的
BeforeUpdate或AfterUpdate事件里,而Requery操作又触发了表单的更新事件,形成循环执行; - 你不小心把这段代码复制了两份,放在了同一个事件里。
可以加个调试语句验证:在代码开头加上:
Debug.Print "INSERT执行时间:" & Now()
然后打开Access的立即窗口(按Ctrl+G),执行操作后看窗口里是不是输出了两次时间。如果是,就去检查事件绑定,确保只有一个触发源。
3. 额外优化建议
- 尽量替换
DoCmd.RunSQL为CurrentDb.Execute mySQL, dbFailOnError,这样SQL出错时会抛出明确的错误信息,方便排查问题; - 确认
[Job Number]的匹配逻辑:Left([Job Number],10)会不会导致不同的原始Job Number被误匹配?比如原Job Number是ABC12345678和ABC12345679,取前10位都是ABC1234567,会同时被选中,这时候要确认业务逻辑是否允许这种匹配规则。
执行修改后的代码前,记得先备份数据,避免误操作!
内容的提问来源于stack exchange,提问作者Gareth Newman




