SQLITE_ERROR:table没有名为errno的列:1,代码:'SQLITE_ERROR'}

时间:2018-03-24 10:07:24

标签: javascript sql database sqlite

我刚在表格中添加了一个新列(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'}

有什么想法吗?

3 个答案:

答案 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,您无法使用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,未使用(可能更低)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等)执行此操作时,这就是问题!