如何使用 Access ODBC 通过一个查询更新多个表?

Posted

技术标签:

【中文标题】如何使用 Access ODBC 通过一个查询更新多个表?【英文标题】:How can I update multiple tables with one query using Access ODBC? 【发布时间】:2013-12-11 19:56:05 【问题描述】:

我已经进行了彻底的搜索,但找不到这个问题的答案。我使用 Access ODBC 连接,需要运行一个查询,该查询基于一个值同时更新多个表。

这是我目前正在做的事情:

$DSN="accessodbc";
$DSN_User="myusername";
$DSN_Passwd="mypassword";
$objConnect = odbc_connect( $DSN, $DSN_User, $DSN_Passwd );

$strSQL1="UPDATE table1 SET column1='dup' WHERE User=" . $user;
$strSQL2="UPDATE table2 SET column1='dup' WHERE User=" . $user;
$strSQL3="UPDATE table3 SET column1='dup' WHERE User=" . $user;

$objExec1 = odbc_exec($objConnect, $strSQL1);
$objExec2 = odbc_exec($objConnect, $strSQL2);
$objExec3 = odbc_exec($objConnect, $strSQL3);

...等大约 50 张桌子。

这可行,但显然不是资源方面的最佳解决方案。有没有办法用一个查询更新所有表?

提前致谢。

【问题讨论】:

【参考方案1】:

虽然使用单个 SQL 语句更新多个表是相当不寻常的,但在这种特殊情况下,您可能可以(尽管对大约 50 个表执行此操作可能比它的价值更麻烦)。

作为记录,我刚刚在 Access 2010 和测试表中测试了以下内容

[table1]
User  column1
----  -------
Gord
Bob          

[table2]
User   column1
-----  -------
Gord
Homer         

[table3]
User      column1
--------  -------
Gord
Quagmire         

查询

UPDATE
    (
        table1
        INNER JOIN
        table2
            ON table1.User = table2.User
    )
    INNER JOIN
    table3
        ON table2.User = table3.User
SET
    table1.column1 = 'dup',
    table2.column1 = 'dup',
    table3.column1 = 'dup'
WHERE table1.User = 'Gord'

导致

[table1]
User  column1
----  -------
Gord  dup    
Bob          

[table2]
User   column1
-----  -------
Gord   dup    
Homer         

[table3]
User      column1
--------  -------
Gord      dup    
Quagmire         

【讨论】:

感谢您的解决方案,我会尝试一下。【参考方案2】:

没有。您不能在单个查询中更新超过 1 个表。但是,您可以将所有更新放入事务中,并在所有更新结束时提交事务。

BEGIN TRANSACTION
   Do all your update statements.
COMMIT TRANSACTION

or, if something goes wrong: 

ROLLBACK TRANSACTION

【讨论】:

对于 Access SQL,绝对的“否”实际上是不正确的。详情见我的回答。 感谢您的回复。你能解释一下“BEGIN TRANSACTION”、“COMMIT TRANSACTION”和“ROLLBACK TRANSACTION”的代码吗?我还是个新手,所以不确定你的意思。非常感谢。 基本上,“BEGIN TRANSACTION”打开一个“事务”......“COMMIT”之前的所有操作实际上在 COMMIT 之前不会发生。然后由于某种原因,例如错误,您可以执行“ROLLBACK”而不是执行“COMMIT”,这会取消执行“BEGIN”以来的所有操作。看这里technet.microsoft.com/en-us/library/ms188929.aspx了解更多详情。 可以使用事务,但不能通过 ODBC。所以如果你使用 dao reocrdset,那么你可以开始一个事务。【参考方案3】:

怎么样

For I = 1 to 50
   $strSQL = "Update table" & I & " set column1 = 'dubp' WHERE User=" & $user
   Odb_exec($objContact,$strSQL)
Next i

【讨论】:

以上是关于如何使用 Access ODBC 通过一个查询更新多个表?的主要内容,如果未能解决你的问题,请参考以下文章

Access如何释放ODBC

如何使用 MySQl 的 ODBC 连接器在 MS Access 中的 VBA 中执行和查询?

MS Access 直通查询更新

如何通过 ODBC 在 Access 中获取详细的 PostgreSQL 错误?

ODBC 连接凭据如何存储在 MS Access 中? [关闭]

使用 ODBC + Access 时转义 SQL 查询中的输入数据