首页 > 解决方案 > 未使用 SQLitePorter 创建数据库表 - 语法错误

问题描述

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

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

谢谢你。

标签: sqlcordovatypescriptionic3cordova-plugins

解决方案


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

例如,KEY是一个 MySQL 关键字;它的 SQLite 等价物是INDEX见这里)。

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

CREATE INDEX fkIdx_30 ON localListItems(itemId)

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


推荐阅读