SQLite Qt自动增量列始终为空
我的应用程序检查数据库文件是否存在,如果不存在,则创建一个数据库文件 其中一个表是这样创建的:SQLite Qt自动增量列始终为空,qt,sqlite,Qt,Sqlite,我的应用程序检查数据库文件是否存在,如果不存在,则创建一个数据库文件 其中一个表是这样创建的: CREATE TABLE tAlumnos ( Nombre VARCHAR (100), Apellido VARCHAR (100), DNI INT UNIQUE, Nacimiento DATE,
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');
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(DBFILE);
但是,当我添加带有如下查询的多行时:
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');
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(DBFILE);
所有keyid列都为空。我不明白。我做错了什么。
如果我使用AUTOINCREMENT而不是AUTO_INCREMENT,我也会得到一个语法错误,以防万一
当我打开数据库时,我是这样做的:
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');
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(DBFILE);
有什么想法吗?您使用了错误的关键字,该关键字是自动增量。然而,这并不是唯一的问题。
AUTOINCREMENT
关键字只能在一种情况下使用,即用于将作为rowid别名的列。对于要作为行ID的别名的列
定义该表(不带ROWID的使用不太常见),并且
??整型主键
(或作为整型,…和其他列定义…),主键(??
(其中?
表示列名)。AUTOINCREMENT
然后可以用作整型主键AUTOINCREMENT
或整型,…和其他后续列定义(如有)主键(?AUTOINCREMENT)
将列定义为keyid INTEGER AUTO_INCREMENT
将导致列类型为INTEGER AUTO_INCREMENT
(这将导致类型关联为INTEGER),因此当没有提供值时,期望提供自动生成的值,默认值为null
因此,您的代码可以是:-
CREATE TABLE tAlumnos ( Nombre VARCHAR (100),
Apellido VARCHAR (100),
DNI INT UNIQUE,
Nacimiento DATE,
Telefono INT,
ICE INT,
keyid INTEGER,
PRIMARY KEY (keyid AUTOINCREMENT) );
或:-
然而
AUTOINCREMENT
关键字很可能不需要,您可能不需要相关的间接费用(请参阅下面的链接)
AUTOINCREMENT关键字会增加CPU、内存、磁盘空间和内存
磁盘I/O开销,如果不是严格需要的话,应该避免
通常不需要
如果插入时未提供值或空值作为值,则主键(??仍将自动生成unqiue id(即,该列将是rowid的别名),而不使用关键字,而是使用
AUTOINCREMENT
仅确保rowid始终增加(注意,不能保证rowid
将单调增加)
不使用AUTOINCREMENT
允许使用小于现有最高rowid的未使用/空闲数字,如果使用可能的最高数字(AUTOINCREMENT
将失败,并出现SQLITE_完全异常)。请注意rowid以及别名可能高达9223372036854775807
- (有关全面的解释,请参见上面的链接)
因此,您可能希望使用:-
CREATE TABLE tAlumnos ( Nombre VARCHAR (100),
Apellido VARCHAR (100),
DNI INT UNIQUE,
Nacimiento DATE,
Telefono INT,
ICE INT,
keyid INTEGER,
PRIMARY KEY (keyid) );
或:-
您使用了错误的关键字,该关键字是自动增量。但是,这不是唯一的问题。只有在一种情况下才能使用自动增量
关键字,即用于将作为rowid别名的列。对于将作为rowid别名的列
不能使用不带ROWID的定义该表(不带ROWID的使用不太常见),并且
该列必须声明为
AUTOINCREMENT
然后可以用作整型主键AUTOINCREMENT
或整型,…和其他后续列定义(如有)主键(?AUTOINCREMENT)
将列定义为keyid INTEGER AUTO_INCREMENT
将导致列类型为INTEGER AUTO_INCREMENT
(这将导致类型关联为INTEGER),因此当没有提供值时,期望提供自动生成的值,默认值为null
因此,您的代码可以是:-
CREATE TABLE tAlumnos ( Nombre VARCHAR (100),
Apellido VARCHAR (100),
DNI INT UNIQUE,
Nacimiento DATE,
Telefono INT,
ICE INT,
keyid INTEGER,
PRIMARY KEY (keyid AUTOINCREMENT) );
或:-
然而
AUTOINCREMENT
关键字很可能不需要,您可能不需要相关的间接费用(请参阅下面的链接)
AUTOINCREMENT关键字会增加CPU、内存、磁盘空间和内存
磁盘I/O开销,如果不是严格需要的话,应该避免
通常不需要
如果插入时未提供值或空值作为值,则主键(??
仍将自动生成unqiue id(即,该列将是rowid的别名),而不使用关键字,而是使用
AUTOINCREMENT
仅确保rowid始终增加(注意,不能保证rowid
将单调增加)
不使用AUTOINCREMENT
允许使用小于现有最高rowid的未使用/空闲数字,如果使用可能的最高数字(AUTOINCREMENT
将失败,并出现SQLITE_完全异常)。请注意rowid以及别名可能高达9223372036854775807
- (有关全面的解释,请参见上面的链接)
因此,您可能希望使用:-
CREATE TABLE tAlumnos ( Nombre VARCHAR (100),
Apellido VARCHAR (100),
DNI INT UNIQUE,
Nacimiento DATE,
Telefono INT,
ICE INT,
keyid INTEGER,
PRIMARY KEY (keyid) );
或:-
感谢您提供了完整且信息丰富的答案。我从一个在MySQL DB中创建表的旧sql脚本中复制了我的代码。在SQLite中似乎有些事情发生了变化。感谢您提供了完整且信息丰富的答案。我从我的一个sql脚本中复制了我的代码