数据库表未使用SQLitePorter创建 - 语法错误

时间:2018-06-06 08:20:56

标签: sql cordova typescript ionic3 cordova-plugins

所以我在使用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)"
}

为什么这不起作用的任何帮助都会受到很多关注。因为我无法理解错误代码。

谢谢。

  • 马特

1 个答案:

答案 0 :(得分:1)

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

例如,KEY是MySQL关键字;它的SQLite等价物是INDEXsee here)。

在SQLite中,无法在CREATE TABLE语句中创建索引,因此需要单独的CREATE INDEX语句,例如

CREATE INDEX fkIdx_30 ON localListItems(itemId)

您可以将SQL粘贴到http://sqlfiddle.com等在线工具中,将引擎设置为SQLite并点击“Build Schema”以测试SQLite中的语法。