SQLite Qt auto_incremet列始终为空

时间:2018-07-06 22:06:04

标签: qt sqlite

我的应用检查数据库文件是否存在,如果不存在,它将创建一个数据库文件。

其中一个表的创建如下:

CREATE TABLE tAlumnos ( Nombre     VARCHAR (100),
                        Apellido   VARCHAR (100),
                        DNI        INT UNIQUE,
                        Nacimiento DATE,
                        Telefono   INT,
                        ICE        INT,
                        keyid      INTEGER AUTO_INCREMENT,
                        PRIMARY KEY (keyid) );

但是,当我添加带有以下查询的服务器行时:

INSERT INTO tAlumnos (Nombre,Apellido,DNI,Nacimiento,Telefono) VALUES ('Pepe','pepe','20369458','2010-05-02','154222326');

所有keyid列均为空。我不明白我究竟做错了什么。 另外,如果使用AUTOINCREMENT而不是AUTO_INCREMENT的话,也会出现语法错误。

当我打开数据库时,我会这样做:

     db = QSqlDatabase::addDatabase("QSQLITE");
     db.setDatabaseName(DBFILE);

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您使用了错误的关键字,关键字为 AUTOINCREMENT 。但是,这并不是唯一的问题。 AUTOINCREMENT关键字只能在一种情况下使用,即用于要作为 rowid 别名的列。要使列成为 rowid 的别名,

  1. 不得使用WITHOUT ROWID定义表(使用WITHOUT ROWID并不常见)和
  2. 该列必须声明为?? INTEGER PRIMARY KEY(或声明为?? INTEGER, ..and other column definitions.., PRIMARY KEY(??)(其中??代表列名)。

AUTOINCREMENT然后可以用作?? INTEGER PRIMARY KEY AUTOINCREMENT?? INTEGER, ..and other subsequent column definitions if any.., PRIMARY KEY(?? AUTOINCREMENT)

将列定义为keyid INTEGER AUTO_INCREMENT将导致列类型为INTEGER AUTO_INCREMENT(这将导致INTEGER的类型相似性),因此,在未提供任何值的情况下,期望自动生成将提供值,默认值为null。

Datatypes In SQLite Version 3

因此,您的代码可能是:-

CREATE TABLE tAlumnos ( Nombre     VARCHAR (100),
                        Apellido   VARCHAR (100),
                        DNI        INT UNIQUE,
                        Nacimiento DATE,
                        Telefono   INT,
                        ICE        INT,
                        keyid      INTEGER,
                        PRIMARY KEY (keyid AUTOINCREMENT) );

或:-

CREATE TABLE tAlumnos ( Nombre     VARCHAR (100),
                        Apellido   VARCHAR (100),
                        DNI        INT UNIQUE,
                        Nacimiento DATE,
                        Telefono   INT,
                        ICE        INT,
                        keyid      INTEGER PRIMARY KEY AUTOINCREMENT);

但是

很有可能不需要AUTOINCREMENT关键字,并且您可能不想要相关的间接费用(请参阅下面的链接)。

  

AUTOINCREMENT关键字强加了额外的CPU,内存,磁盘空间和   磁盘I / O开销,如果没有严格要求,则应避免。它是   通常不需要。

SQLite Autoincrement

如果没有值,则不使用关键字而是使用?? INTEGER PRIMARY KEY?? INTEGER, PRIMARY KEY(??)仍会自动生成unqiue ID(即列将是 rowid 的别名)或在插入时将null用作值,而不会产生开销。

AUTOINCREMENT仅确保rowid始终增加(请注意,不能保证rowid  将单调增加)。

如果不使用AUTOINCREMENT,则应使用小于现有最高行ID的未使用/可用数字,如果应该使用可能的最高编号(AUTOINCREMENT将会失败,并出现SQLITE_FULL异常)。请注意, rowid (因此是别名)可以高达922337203685477575807。

  • (有关详细说明,请参见上面的链接)

因此,您可能希望使用以下任一方法:-

CREATE TABLE tAlumnos ( Nombre     VARCHAR (100),
                        Apellido   VARCHAR (100),
                        DNI        INT UNIQUE,
                        Nacimiento DATE,
                        Telefono   INT,
                        ICE        INT,
                        keyid      INTEGER,
                        PRIMARY KEY (keyid) );

或:-

CREATE TABLE tAlumnos ( Nombre     VARCHAR (100),
                        Apellido   VARCHAR (100),
                        DNI        INT UNIQUE,
                        Nacimiento DATE,
                        Telefono   INT,
                        ICE        INT,
                        keyid      INTEGER PRIMARY KEY);