代码之家  ›  专栏  ›  技术社区  ›  Matthew M

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

  •  0
  • Matthew M  · 技术社区  · 7 年前

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

    我的assets文件夹中有一个名为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 回复  |  直到 7 年前
        1
  •  1
  •   DaveAlden    7 年前

    您的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中的语法是否有效。