sql - 未使用 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)"
}
任何关于为什么这不起作用的帮助都会非常有用。因为我无法理解错误代码。
谢谢你。
- 马特
解决方案
您的 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 中的语法是否有效。
推荐阅读
- javascript - OpenLayers Timeline 实现带时间的历史标记播放器
- openssl - conda install CondaHTTPError:HTTP 000 尝试 >1 (+解决方法)
- elasticsearch - elasticsearch 查询是如何在操作系统级别执行的?
- visual-studio-code - VSCode:选择整个函数定义?
- python - 如果缺少某些日子,如何使用 groupby 在 pandas 数据框上创建 30 天的完整窗口
- gitlab-ci - 合并后Gitlab主分支管道未运行
- ios - 如何从安装在 iOS 设备上的 iOS 应用程序中捕获打印语句?
- typescript - 导出可变值:import vs require
- python - 读取 JSON URL 后如何弹出 [List]?
- javascript - Chart.js 3.x 迁移问题 - 首次加载时图表周围出现细白边框/填充