访问:如果表不存在则创建表

Posted

技术标签:

【中文标题】访问:如果表不存在则创建表【英文标题】:Access: create table if it does not exist 【发布时间】:2009-05-26 07:26:02 【问题描述】:

你能提供一个相当于 mysql 'CREATE TABLE IF NOT EXISTS ...' 的 MS Access 吗?

更新

类似的东西

IF <no such table>
CREATE TABLE history(<fields>)

也适合

【问题讨论】:

如果重要的话,专门访问 2003 【参考方案1】:

对于 SQL DDL 代码,答案是否定的。 ACE/Jet SQL 没有任何流控制语法,ACE/Jet PROCEDURE 只能执行一条 SQL 语句。是的,没错:ACE/Jet PROCEDURE 不支持程序代码 :(

【讨论】:

这就是为什么我认为它们不是任何有意义的术语定义的程序。 它们本身就很好:SQL 代码只属于“后端”,IMO。但是我们不要争论:)【参考方案2】:

这是通过 VBA 实现的方法:

Sub ViaVBA()
    Const strSQLCreateFoo_c As String = _
          "CREATE TABLE Foo" & _
          "(" & _
          "MyField1 INTEGER," & _
          "MyField2 Text(10)" & _
          ");"
    Const strSQLAppendBs_c As String = _
          "INSERT INTO Foo (MyField1, MyField2) " & _
          "SELECT Bar.MyField1, Bar.MyField2 " & _
          "FROM Bar " & _
          "WHERE Bar.MyField2 Like 'B*';"

    If Not TableExists("foo") Then
        CurrentDb.Execute strSQLCreateFoo_c
    End If
    CurrentDb.Execute strSQLAppendBs_c
End Sub

Private Function TableExists(ByVal name As String) As Boolean
    On Error Resume Next
    TableExists = LenB(CurrentDb.TableDefs(name).name)
End Function

【讨论】:

TableExists() 函数在哪里?我自己写了(实际上,我写了 4 个不同的版本,使用不同的方法来解决问题),但据我所知,Access 中没有这样的功能。 是的,我猜如果我发布整个示例会有所帮助:) 已修复。作为一项规则,我尽量避免使用错误测试函数,但碰巧这比迭代集合和检查每个名称运行得更快。 有趣的评论。我也反对错误测试,所以我编写了三个版本的 TableExists 函数。一个使用错误,第二个遍历 TableDefs 集合,第三个在 MSysObjects 中查找。对于初始化数据库变量时的一次性使用,MSysObjects 版本是最快的。当使用预先存在的 db 变量在循环中调用时,引发错误的版本最快。 TableDefs 版本的速度与表的数量成正比。自测试以来,我选择了错误测试版本,尽管我的版本要复杂得多。【参考方案3】:

为什么要创建一个表?如果是用于临时数据存储,那很好,否则通常不需要。

请参阅我网站上的 TempTables.MDB 页面,该页面说明了如何在您的应用中使用临时 MDB。 http://www.granite.ab.ca/access/temptables.htm

【讨论】:

不需要,你可以使用 ACE/Jet SQL DDL "CREATE TEMPORARY TABLE"。有关 CREATE TABLE 语句 (office.microsoft.com/en-gb/access/HA012314411033.aspx) 的信息,请参阅 Access2007 帮助:“创建 TEMPORARY 表时,它仅在创建它的会话中可见。当会话终止时,它会自动删除。临时表可以由更多人访问不止一个用户。” ...抱歉,我的小玩笑,忍不住了。当然,这只是 ACE/Jet 引擎糟糕文档的又一个例子 :( ...除了遗漏(谁没有 DEFAULT?)和 IMO 糟糕的措辞,仅在这一页上我就发现了至少两个其他重大错误陈述!

以上是关于访问:如果表不存在则创建表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 模型 - 如果数据库表不存在则返回 null

MySQL 仅在表不存在时插入数据

如果表不存在,则插入其他表

PHP - MySQL - 表不存在

spark读取hbase数据,如果表存在则不做任何操作,如果表不存在则新建表。

使用 sqitch 中的 mysql 查询验证表不存在