MS Access 中的 Create Table 语句语法错误,但 phpmyadmin 中没有

Syntax Error in Create Table Statement in MS Access but not in phpmyadmin

我需要从现有的 mySQL 数据库创建一个 Access 数据库。我能够使用 ODBC 连接导入一些 tables,但一些 tables 出错了(说 'Cannot define field more than once')。我无法弄清楚为什么会出现该错误(在任何失败的 table 中都没有重复名称的字段,也没有任何具有特殊字符的字段),所以我决定只生成 SQL 来自 Toad 的 tables.

我从 Toad 得到的第一个 table SQL 如下,在 phpmyadmin 或 toad 中没有错误。为什么 Access 告诉我存在语法错误? Access 也没有突出显示或下划线任何内容来指示可能存在语法错误的位置。

我尝试将 ` 引号替换为单引号 ' 和双引号 "

我也尝试删除 ENGINE=InnoDB DEFAULT CHARSET=utf8 部分。

知道是什么导致了 Access 中的问题吗?或者将这些失败的 table 放入 Access 的其他方法?

谢谢!

CREATE TABLE tblHemisphericalPhoto (
  PlotID varchar(10) NOT NULL,
  SubplotID int(11) NOT NULL,
  [year] int(11) NOT NULL,
  fldStorageLocation varchar(100) NOT NULL,
  fldFilename varchar(100) NOT NULL,
  fldPhotoLocation varchar(45) NOT NULL,
  fldLensHeight decimal(6,2) DEFAULT NULL,
  PRIMARY KEY (fldStorageLocation,fldFilename,[year],PlotID,SubplotID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Access 和 MySQL SQL 方言不太匹配。此外,Access DDL 附带的细节对许多人来说是不受欢迎的惊喜(特别参见下面的注释 2)。因此,将 MySQL CREATE TABLE 语句转换为 Access SQL 可能具有挑战性。

将 MySQL table 导入 Access 会更容易。但是,由于您在尝试导入时遇到错误,我会尝试 link table,然后 运行 一个“make table”查询来提取数据进入新的访问 table:

SELECT * INTO NewAccessTableName FROM LinkedTableName

获得访问权限 table 后,您可以根据需要在 table 的 设计视图 中添加主键和修改字段属性。

但是,如果您必须或想要使用 Access DDL,这里有一个在 Access 中成功测试的版本:

strCreate = "CREATE TABLE tblHemisphericalPhoto (PlotID varchar(10) NOT NULL, " & _
    "SubplotID int NOT NULL, [year] int NOT NULL, fldStorageLocation varchar(100) " & _
    "NOT NULL, fldFilename varchar(100) NOT NULL, fldPhotoLocation varchar(45) " & _
    "NOT NULL, fldLensHeight decimal(6,2) DEFAULT Null, " & _
    "CONSTRAINT pkey PRIMARY KEY (fldStorageLocation,fldFilename,[year],PlotID,SubplotID))"

CurrentProject.Connection.Execute strCreate

备注:

  1. int 字段类型具有固定长度。如果您尝试 int(<some number>)
  2. ,Access 会报错
  3. decimal 字段类型可能是 Access 中的一个“陷阱”问题。它在 CREATE TABLE 中是合法的,但仅当该语句通过 OleDb 执行时才有效。它适用于 CurrentProject.Connection.Execute,因为这是一个 ADO 方法,因此使用 OleDb。
  4. DEFAULT在Access DDL中也是合法的,但是必须通过OleDb来执行。但是我不明白为什么它在这里有用。当您添加一行但没有为该字段提供值时,除非您指定其他默认值,否则它将为 Null。
  5. Access 不接受您原来的 PRIMARY KEY 约束。我 re-wrote 它遵循以下模式:CONSTRAINT <constraint name> PRIMARY KEY (<field list>)