如何一次删除所有 ms-access 表中的数据?

Posted

技术标签:

【中文标题】如何一次删除所有 ms-access 表中的数据?【英文标题】:How to delete data in all ms-access tables at once? 【发布时间】:2009-03-26 09:46:11 【问题描述】:

MS-Access 有没有办法一次性删除所有表中的数据。我们在access中运行一个数据库,每个月保存数据,然后删除access中的所有数据。但它需要从很多表中删除数据。难道没有更简单/更容易的方法吗?

【问题讨论】:

你也可以使用便宜的 fiver 演出:fiverr.com/cristiscutaru/… 【参考方案1】:

您为什么不保留一份数据库的空副本。在月底,保存现有数据库,然后将空数据库复制到原来的位置。

【讨论】:

这也意味着你不需要压缩和修复。 很好的答案。非常务实。 然后您必须在空数据库上复制任何修复或改进。我已经这样做了一段时间,但它很容易出错,更不用说乏味了。我会尝试其他解决方案。【参考方案2】:

克雷格的回答简单明了。如果您真的想要一个编程解决方案,以下 VBA 脚本将清除每个表中的所有数据,不包括隐藏表。它需要启用 DAO - 在 Visual Basic 编辑器中,转到工具 -> 参考,然后勾选 Microsoft DAO 3.6 对象库,然后确定:

Public Sub TruncateTables()
'Majority of code taken from a data dictionary script I can no longer source nor find the author

On Error GoTo Error_TruncateTables

Dim DB As DAO.Database
Dim TDF As DAO.TableDef
Dim strSQL_DELETE As String

Set DB = CurrentDb()

    For Each TDF In DB.TableDefs
        If Left(TDF.Name, 4) <> "MSys" Then
            strSQL_DELETE = "DELETE FROM " & TDF.Name & ";"
            DB.Execute strSQL_DELETE
        End If
    Next

MsgBox "Tables have been truncated", vbInformation, "TABLES TRUNCATED"
DB.Close

Exit_Error_TruncateTables:
    Set TDF = Nothing
    Set DB = Nothing
    Exit Sub

Error_TruncateTables:
    Select Case Err.Number
        Case 3376
            Resume Next 'Ignore error if table not found
         Case 3270 'Property Not Found
            Resume Next
        Case Else
            MsgBox Err.Number & ": " & Err.Description
            Resume Exit_Error_TruncateTables
    End Select
End Sub

【讨论】:

【参考方案3】:

Alistair 的回答很好,虽然需要更新。旧的 if 语句会导致错误,并且旧的动态字符串不适用于名称包含空格的表。它将像“人员信息”这样的名称视为“人员”。如果您希望某些表保留其数据,我已经更新了代码,并且更容易向 if 语句添加异常。

 Public Sub TruncateTables()
    'Majority of code taken from a data dictionary script I can no longer source nor find the author

    On Error GoTo Error_TruncateTables

    Dim DB As DAO.Database
    Dim TDF As DAO.TableDef
    Dim strSQL_DELETE As String

    Set DB = CurrentDb()

        For Each TDF In DB.TableDefs
            If Not (TDF.Name Like "MSys*" Or TDF.Name Like "~*" Or Len(TDF.Connect) > 0) Then
                'This will prevent system, temporary and linked tables from being cleared
                strSQL_DELETE = "DELETE FROM " & "[" & TDF.Name & "]"
                DB.Execute strSQL_DELETE
            End If
        Next

    MsgBox "Tables have been truncated", vbInformation, "TABLES TRUNCATED"
    DB.Close

    Exit_Error_TruncateTables:
        Set TDF = Nothing
        Set DB = Nothing
        Exit Sub

    Error_TruncateTables:
        Select Case Err.Number
            Case 3376
                Resume Next 'Ignore error if table not found
             Case 3270 'Property Not Found
                Resume Next
            Case Else
                MsgBox Err.Number & ": " & Err.Description
                Resume Exit_Error_TruncateTables
        End Select
    End Sub

【讨论】:

当心!这也将清除任何链接表。我将编辑以添加条件Len(tdf.Connect) = 0 以防止这种情况发生。【参考方案4】:

由于这是一个重复的动作,如果你编写一个简单的 SQL 脚本来执行此操作会更好。

DELETE FROM <table1>;
DELETE FROM <table2>;
...
DELETE FROM <tablen>;

【讨论】:

MS-access 不允许在脚本中有多个 DELETE 查询。【参考方案5】:

突出显示所有 ROWS,然后按键盘上的 Delete 键。如果访问正在做那件事,它不会让你进入底部,然后进入一个单元格并单击 ctrl+向下箭头。要突出显示所有行,请突出显示顶行,然后滚动到底行并在选择底行时按住 shift。所有行都应突出显示。

【讨论】:

【参考方案6】:

这将删除除系统表之外的所有表中的所有数据

Dim T As TableDef
DoCmd.SetWarnings False
For Each T In CurrentDb.TableDefs
    If T.Name Like "d2s_*" Then
        DoCmd.RunSQL "DELETE * FROM " & T.Name
    End If
Next T
DoCmd.SetWarnings True

另一种方法:(基于Christopher Duke的建议)

Dim T As TableDef
DoCmd.SetWarnings False
For Each T In CurrentDb.TableDefs
    If Not Left(T.Name, 4) = "MSys" Then
        DoCmd.RunSQL "DELETE * FROM [" & T.Name & "]"
    End If
Next T
DoCmd.SetWarnings True

【讨论】:

以上是关于如何一次删除所有 ms-access 表中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MYSQL 查询访问 Ms-Access 数据库

如何使用 Django 删除表中的所有数据

对于我的以下要求,MS-Access 中的查询是啥?

如何批量检查 MS-Access 中的重复项并记录更改?

如何一次性从 PostgreSQL 表中删除所有 NOT NULL 约束

PostgreSQL删除数据