【问题标题】:Database table not being created using SQLitePorter - Syntax Error未使用 SQLitePorter 创建数据库表 - 语法错误
【发布时间】:2018-11-15 20:25:39
【问题描述】:

所以我在使用 SQLitePorter 插件创建特定表时遇到了问题。

我的资产文件夹中有一个名为 initDB.sql 的文件,其中我有这个 SQL 行:

CREATE TABLE IF NOT EXISTS `localListItems` (
   `id` INTEGER NOT NULL ,
   `quantity` TINYINT(2) NOT NULL , 
   `checked` TINYINT(1) NOT NULL DEFAULT 0 ,
   `listId` INTEGER NOT NULL , 
   `itemId` INTEGER NOT NULL , 
    PRIMARY KEY (`id`), 
    KEY `fkIdx_26` (`listId`), 
    CONSTRAINT `FK_26` 
      FOREIGN KEY `fkIdx_26` (`listId`) 
      REFERENCES `localLists` (`id`) 
      ON DELETE CASCADE, 
    KEY `fkIdx_30` (`itemId`), 
    CONSTRAINT `FK_30` 
      FOREIGN KEY `fkIdx_30` (`itemId`) 
      REFERENCES `localItems` (`id`) 
      ON DELETE CASCADE
);

缩小版:

CREATE TABLE IF NOT EXISTS `localListItems` ( `id` INTEGER NOT NULL , `quantity` TINYINT(2) NOT NULL , `checked` TINYINT(1) NOT NULL DEFAULT 0 , `listId` INTEGER NOT NULL , `itemId` INTEGER NOT NULL , PRIMARY KEY (`id`), KEY `fkIdx_26` (`listId`), CONSTRAINT `FK_26` FOREIGN KEY `fkIdx_26` (`listId`) REFERENCES `localLists` (`id`) ON DELETE CASCADE, KEY `fkIdx_30` (`itemId`), CONSTRAINT `FK_30` FOREIGN KEY `fkIdx_30` (`itemId`) REFERENCES `localItems` (`id`) ON DELETE CASCADE);

在文档中被缩小,因此占用一行以防止转义错误'\n'

我正在使用以下打字稿代码调用此文件:

this.httpClient.get('assets/initDB.sql', { responseType: 'text' })
      .subscribe((sql:any) => {
        this.sqlitePorter.importSqlToDb(this.database, sql)
          .then(data => {
            this.databaseReady.next(true);
            this.storage.set('database_filled', this.databaseVersionControl);
          })
          .catch(e => console.log(e));
      });

所有其他表都根据需要插入(上面未显示),但是上面的 SQL 在 PHPMyAdmin 中工作正常,但在尝试使用 SQLite 创建时无法正常工作。

控制台中出现的错误是以下JSON。

{
  "code":5,
  "message":"Failed to import SQL; message=near \"KEY\": syntax error",
  "statement":"CREATE TABLE IF NOT EXISTS `localListItems` ( `id` INTEGER NOT NULL , `quantity` TINYINT(2) NOT NULL , `checked` TINYINT(1) NOT NULL DEFAULT 0 , `listId` INTEGER NOT NULL , `itemId` INTEGER NOT NULL , PRIMARY KEY (`id`), KEY `fkIdx_26` (`listId`), CONSTRAINT `FK_26` FOREIGN KEY `fkIdx_26` (`listId`) REFERENCES `localLists` (`id`) ON DELETE CASCADE, KEY `fkIdx_30` (`itemId`), CONSTRAINT `FK_30` FOREIGN KEY `fkIdx_30` (`itemId`) REFERENCES `localItems` (`id`) ON DELETE CASCADE)"
}

任何关于为什么这不起作用的帮助都会非常感激。由于我无法理解错误代码。

谢谢。

  • 马特

【问题讨论】:

    标签: sql cordova typescript ionic3 cordova-plugins


    【解决方案1】:

    您的 SQL 语句正在使用 MySQL 语法,但您正尝试将其导入 SQLite 数据库。

    例如,KEY 是 MySQL 关键字;它的 SQLite 等效项是 INDEX (see here)。

    在SQLite中,不能在CREATE TABLE语句中创建索引,所以需要单独的CREATE INDEX语句,例如

    CREATE INDEX fkIdx_30 ON localListItems(itemId)
    

    您可以将您的 SQL 粘贴到在线工具(例如 http://sqlfiddle.com)中,将引擎设置为 SQLite,然后点击“Build Schema”以测试 SQLite 中的语法是否有效。

    【讨论】:

    • 完美,我不敢相信这是这么简单的事情,过去一天让我发疯了!感谢您的帮助,戴夫。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多