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

4

你能否给出一个与MySQL中的CREATE TABLE IF NOT EXISTS ...等价的MS Access语句?

类似于这样:

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

也同样适用。


具体而言,如果有关Access 2003的问题,请访问以下网站。 - jonny
3个回答

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

3
我认为它们不符合任何有意义定义的程序,这就是我提出这个观点的原因。 - David-W-Fenton
它们就是它们,对于SQL代码来说,我认为它们只属于“后端”。但是,让我们不要争论 :) - onedaywhen

4

以下是通过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中没有这样的函数。 - David-W-Fenton
1
是的,我猜如果我发布整个示例会更有帮助:) 已修复。通常我会尽量避免测试错误函数,但恰好这比迭代集合并检查每个名称要快。 - Oorang
有趣的评论。我也反对试错,所以我编写了三个版本的TableExists函数。其中一个使用错误,第二个遍历TableDefs集合,第三个在MSysObjects中进行查找。对于单个用途,当您初始化数据库变量时,MSysObjects版本最快。当在具有预先存在的db变量的循环中调用时,引发错误的版本最快。 TableDefs版本的速度与表的数量成比例。经过测试,我最终选择了试错版本,尽管我的版本要复杂得多。 - David-W-Fenton

-2
为什么要创建一个表?如果是为了临时数据存储,那就没问题,否则通常是不必要的。
请参阅我的网站上的TempTables.MDB页面,其中说明了如何在应用程序中使用临时MDB。http://www.granite.ab.ca/access/temptables.htm

不需要那样做,您可以使用ACE/Jet SQL DDL "CREATE TEMPORARY TABLE"。请参阅Access2007帮助中的CREATE TABLE语句(http://office.microsoft.com/en-gb/access/HA012314411033.aspx):“创建TEMPORARY表时,它仅在创建它的会话中可见。当会话终止时,它会自动删除。多个用户可以访问临时表。” - onedaywhen
抱歉,我的小玩笑,忍不住了。当然,这只是ACE/Jet引擎可怕文档的又一个例子 :( - onedaywhen
1
除了遗漏(谁没有默认值?)和我认为措辞不佳之外,仅在那一页上我就发现了至少两个实质性的错误陈述! - onedaywhen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接