8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 Microsoft Access 中更新插入

seans 1月前

24 0

我需要为 MS-Access 2000 编写一个 SQL 查询,以便如果某行存在则更新该行,如果不存在则插入该行。(我认为这称为 \'upsert\')即如果行存在...UPDATE Table1 SET...

我需要为 MS-Access 2000 编写一个 SQL 查询,以便如果某行存在则更新该行,如果不存在则插入该行。(我认为这称为“upsert”)

IE

如果行存在...

UPDATE Table1 SET (...) WHERE Column1='SomeValue'

如果不存在...

INSERT INTO Table1 VALUES (...)

这可以在一个查询中完成吗?

帖子版权声明 1、本帖标题:在 Microsoft Access 中更新插入
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由seans在本站《ms-access》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 正如其他人提到的,您可以 UPSERT 使用新表作为左侧。这将添加所有缺失的记录并更新匹配的记录,使已删除的记录保持完整 UPDATE LEFT JOIN

    如果我们按照 创建并运行更新查询文章, 我们最终会得到如下 SQL:

    UPDATE Table1 
    INNER JOIN NewTable1 ON Table1.ID = NewTable1.ID 
    SET Table1.FirstName = [NewTable1].[FirstName] 
    

    但内连接只会更新匹配的记录,不会添加新记录。因此,让我们将其更改 INNER LEFT

    UPDATE Table1 
    LEFT JOIN NewTable1 ON Table1.ID = NewTable1.ID 
    SET Table1.FirstName = [NewTable1].[FirstName]
    

    现在保存数据库的副本。在主数据库上运行此操作之前,请先对副本进行测试。

  • 您不需要捕获错误。相反,只需运行 INSERT 语句,然后检查

    CurrentDb.RecordsAffected
    

    视情况而定,它或者是 1 或者是 0。

    注意:针对 CurrentDB 执行不是好习惯。最好将数据库捕获到本地变量中:

    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute(INSERT...)
    If db.RecordsAffected = 0 Then
      db.Execute(UPDATE...)
    End If
    
  • EMF 1月前 0 只看Ta
    引用 4

    感谢 RolandTumble 的评论。你刚刚证实了我的怀疑,将错误条件用作正常流程是一种不好的做法。这是我一直想知道的事情,但我还没有真正得出结论。

  • 对我来说,这几乎是投反对票的边缘。在我看来,在正常的处理流程中使用错误是一个坏主意——不仅仅是代码味道,而且是恶臭。在我看来,HansUp 给出了更好的答案。然而,有时这是不可避免的,所以我实际上不会投票……

  • 我通常先运行插入语句,然后检查是否发生错误 3022,这表明该行已经存在。因此,如下所示:

    On Error Resume Next
    CurrentDb.Execute "INSERT INTO Table1 (Fields) VALUES (Data)", dbFailOnError
    If Err.Number = 3022 Then
        Err.Clear        
        CurrentDb.Execute "UPDATE Table1 SET (Fields = Values) WHERE Column1 = 'SomeValue'", dbFailOnError
    ElseIf Err.Number <> 0 Then
        'Handle the error here
        Err.Clear
    End If
    

    编辑1:
    我想说的是,我在这里发布的是一种非常常见的解决方案,但您应该知道,计划错误并将其用作程序正常流程的一部分通常被认为是一个坏主意,特别是如果有其他方法可以实现相同的结果。感谢 RolandTumble 指出这一点。

  • 如果您想要 UPSERT 一个与任何其他表或查询都没有关系的单个表,该怎么办?

  • 如果表具有唯一键,则可以进行“upsert”。

    的这个老建议 Smart Access 是我最喜欢的建议之一:

    使用一个查询更新并附加记录

    艾伦·比格斯

    您是否知道可以使用 Access 中的更新查询同时更新和添加记录?如果您有两个版本的表(tblOld 和 tblNew),并且想要将 tblNew 中的更改集成到 tblOld 中,则此功能非常有用。

    请按以下步骤操作:

    创建更新查询并添加两个表。通过将 tblNew 的关键字段拖到 tblOld 的匹配字段上来连接两个表。

    1. p7

    2. p8

    3. p9

    4. p10

    5. p11

    这只会将已添加到 tblNew 的记录添加到 tblOld。tblOld 中不存在但 tblNew 中不存在的记录仍将保留在 tblOld 中。

  • 谢谢你的引用!我完全同意我自己的观点!:) 无论如何,我会用 LEFT JOIN 来做这件事,并且只插入尚不存在的记录。

  • Rsm 1月前 0 只看Ta
    引用 10

    上有唯一索引 Column1 ,则可以使用 DCount 表达式来确定是否有零行或一行带有 Column1 = 'SomeValue' 。 然后 INSERT UPDATE 基于该计数。

    If DCount("*", "Table1", "Column1 = 'SomeValue'") = 0 Then
        Debug.Print "do INSERT"
    Else
        Debug.Print "do UPDATE"
    End If
    

    我更喜欢这种方法,而不是先尝试 INSERT ,捕获 3022 键冲突错误,然后执行 UPDATE 以响应错误。但是我不能声称我的方法有很大的好处。如果您的表包含自动编号字段,避免失败 INSERT 将阻止您不必要地扩展下一个自动编号值。我还可以避免 INSERT 在不需要时构建字符串。Access Cookbook 告诉我字符串连接在 VBA 中是一项相当昂贵的操作,因此我会寻找机会避免构建字符串,除非它们确实需要。这种方法还可以避免为不需要的创建锁 INSERT .

    但是,这些原因可能对您来说都不是那么有说服力。老实说,我认为在这种情况下我的偏好可能是“我觉得正确”的。我同意 @David-W-Fenton 之前 Stack Overflow 问题 : “最好在编写 SQL 时不要尝试附加已经存在的值 - 即首先防止错误发生,而不是依靠数据库引擎来拯救您自己。”

  • @EmoryLu 参见 PipperChip 的注释:代码更新 a。诀窍在于,如果 a 中没有匹配的行,则将创建该行。这就是 UPSERT(UPdate 或 inSERT)的原理

  • 抱歉,我对此很陌生。有人能解释一下为什么这样做有效吗?这个答案不是在更新 b,而是在更新 a 中的值吗?这个答案如何插入新记录?我只理解这里的“更新”部分,但不理解“插入”部分。如果我错了,请纠正我。

  • 可以 使用 UPDATE 带有 LEFT JOIN .

    update b
    left join a on b.id=a.id
    set a.f1=b.f1
    , a.f2=b.f2
    , a.f3=b.f3
    

    (编辑,2023 年 8 月)

    有些人可能会发现这种形式更容易理解:

    UPDATE main_table RIGHT JOIN new_data 
        ON main_table.id = new_data.id
    SET
        main_table.id = new_data.id,
        main_table.col_1 = new_data.col_1,
        main_table.col_2 = new_data.col_2
    
  • 此外,如果是复制的 MDB,删除将非常成问题。同样,如果删除了许多记录,则无论数据文件是 MDB 还是 ACCDB 格式,都会造成碎片化。基本上,我认为 DELETE 方法是一个非常糟糕的主意。

返回
作者最近主题: