我刚在表格中添加了一个新列(USR_IMG),如下所示:
CREATE TABLE USERS (
USR_ID TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
USR_NAME VARCHAR(50) NOT NULL UNIQUE,
USR_ORGANIZATION VARCHAR(100) NULL,
USR_MAIL VARCHAR(45) NOT NULL,
USR_PASSWORD VARCHAR(255) NOT NULL,
USR_IMG VARCHAR(150) NULL,
PRIMARY KEY(USR_ID)
);
当我使用以下代码添加新用户时:
var salt = createSalt();
db.run('INSERT INTO USERS (USR_NAME,USR_ORGANIZATION,USR_MAIL,USR_PASSWORD, USR_IMG) VALUES ($username, $org, $mail, $password, $img)', {
$username : req.username,
$password : salt + ":" + hashPassword(req.password, salt),
$org : req.org,
$mail : req.mail,
$img: req.img
}, function (result) {
if (result == null) {
res({
status: "Done"
});
}
else {
console.log(result)
log(result, "error");
res({
error: result
});
}
});
}
似乎添加的新列(USR_IMG)未正确添加,因为我收到以下错误:
{错误:SQLITE_ERROR:表USERS没有名为USR_IMG errno的列: 1,代码:'SQLITE_ERROR'}
有什么想法吗?
答案 0 :(得分:0)
您的问题是您已AUTO_INCREMENT
编码,正确的关键字为AUTOINCREMENT
。但是,在SQLite中AUTOINCREMENT
只能在特定情况下使用。也就是说,必须使用INTEGER PRIMARY KEY AUTOINCREMENT
类型定义列(NOT NULL / UNIQUE是隐式的,每个表也只能有一个这样的列)。
所以USR_ID TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
应该是(如果你想要AUTOINCREMENT
,你可能不需要它,如下所述): -
USR_ID INTEGER PRIMARY KEY AUTOINCREMENT,
(更有可能USR_ID INTEGER PRIMARY KEY,
,即没有AUTOINCREMENT )。
但是,由于PRIMARY KEY
具体为PRIMARY KEY(USR_ID)
,因此您会收到语法错误。因此,您的代码应该是以下任一项(即没有PRIMARY KEY(USR_ID)
和结束前一行的逗号,因为没有延续): -
CREATE TABLE USERSS (
USR_ID INTEGER PRIMARY KEY,
USR_NAME VARCHAR(50) NOT NULL UNIQUE,
USR_ORGANIZATION VARCHAR(100) NULL,
USR_MAIL VARCHAR(45) NOT NULL,
USR_PASSWORD VARCHAR(255) NOT NULL,
USR_IMG VARCHAR(150) NULL
);
CREATE TABLE USERSS (
USR_ID INTEGER PRIMARY KEY AUTOINCREMENT,
USR_NAME VARCHAR(50) NOT NULL UNIQUE,
USR_ORGANIZATION VARCHAR(100) NULL,
USR_MAIL VARCHAR(45) NOT NULL,
USR_PASSWORD VARCHAR(255) NOT NULL,
USR_IMG VARCHAR(150) NULL
);
ALTER TABLE USERS ADD COLUMN USR_ID INTEGER PRIMARY KEY
(有或没有AUTOINCREMENT
)。因此,您必须DROP
表格,然后CREATE
。 使用SQLite编码?? INTEGER PRIMARY KEY
(其中??是列名)使该列成为rowid的别名,如果没有WITHOUT ROWID
编码,则该列为64位整数的唯一值对于表格,在这种情况下,您无法编码AUTOINCREMENT
。
第一个分配的rowid将为1(除非被覆盖),下一个可能是2然后是3 ......但是不能保证单调增加。
AUTOINCREMENT
强制执行每个新rowid(以及别名它的列)将大于该表的任何现有rowid,而没有AUTOINCREMENT
,未使用(可能更低} em>)id可以被分配(仅在达到最高值之后)。 AUTOINCREMENT会产生开销,因为算法更复杂,系统表(sqlite_sequence)必须更新,因为它存储了最后一个插入的id(最后使用的最高和最高的rowid用作下一个rowid的基础)。
您可能希望阅读SQLite Autoincrement。虽然这个摘录,第一句总结: -
AUTOINCREMENT关键字会占用额外的CPU,内存,磁盘空间和 磁盘I / O开销,如果不是严格需要,应该避免。它是 通常不需要。
答案 1 :(得分:0)
您好,缺少括号替换此代码,这将起作用
db.run('INSERT INTO USERS (USR_NAME,USR_ORGANIZATION,USR_MAIL,USR_PASSWORD, USR_IMG) VALUES ($username, $org, $mail, $password, $img)'), {
答案 2 :(得分:0)
我正在从我的计算机中的本地文件编辑该方案,当我应该从SQL客户端(SQuirreL,DBeaver等)执行此操作时,这就是问题!